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 中選出 最大 的字元,將它 ...