BZOJ 1370 Gang團夥 映象並查集

2021-08-08 17:25:00 字數 1156 閱讀 7483

time limit: 2 sec  

memory limit: 64 mb

submit: 772  

solved: 424 [

submit][

status][

discuss]

在某城市裡住著n個人,任何兩個認識的人不是朋友就是敵人,而且滿足: 1、 我朋友的朋友是我的朋友; 2、 我敵人的敵人是我的朋友; 所有是朋友的人組成乙個團夥。告訴你關於這n個人的m條資訊,即某兩個人是朋友,或者某兩個人是敵人,請你編寫乙個程式,計算出這個城市最多可能有多少個團夥?

第1行為n和m,n小於1000,m小於5000; 以下m行,每行為p x y,p的值為0或1,p為0時,表示x和y是朋友,p為1時,表示x和y是敵人。

乙個整數,表示這n個人最多可能有幾個團夥。64

e 1 4

f 3 5

f 4 6

e 1 23,,

[submit][

status][

discuss]

home

back

很簡單的並查集, 因為有敵人或朋友兩種種類, 自然而然的想到拆點.

如果a和b是朋友的話, 就把a和b分別的集合合併: 

如果是敵人的話, 那麼就把a 和 b + n, a + n 和 b分別的集合合併. 什麼意思呢? 因為敵人的敵人是朋友, 所以我們對於某點a, 設乙個映象一般的點a+n, a+n所在的並查集就是a的敵人的並查集, 所以a 和 b + n合併, 滿足敵人的敵人是朋友(b+n是b的敵人的集合). a + n 和 b合併同理. 最後處理一遍有多少個集合就可以了.

#includeconst int maxn = 2005;

char ch[1];

bool vis[maxn];

int fa[maxn], ans, n, m;

inline const int read()

int find(int x)

int main()

for(int i = 1; i <= n; ++i) vis[find(i)] = true;

for(int i = 1; i <= 2 * n; ++i) if(vis[i]) ans++;

printf("%d\n", ans);

}

1370 最小函式值 minval

有nn個函式,分別為f1,f2,fnf1,f2,fn。定義fi x aix2 bix ci x n fi x aix2 bix ci x n 給定這些ai biai bi和cici,請求出所有函式的所有函式值中最小的mm個 如有重複的要輸出多個 第一行輸入兩個正整數nn和mm。以下nn行每行三個正整...

1370 上公升下降字串

題目描述 給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 接在 ...

1370 上公升下降字串

上公升下降字串 給你乙個字串 s 請你根據下面的演算法重新構造字串 從 s 中選出 最小 的字元,將它 接在 結果字串的後面。從 s 剩餘字元中選出 最小 的字元,且該字元比上乙個新增的字元大,將它 接在 結果字串後面。重複步驟 2 直到你沒法從 s 中選擇字元。從 s 中選出 最大 的字元,將它 ...