团伙 并查集
問題描述
在某城市里住著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個人最多可能有幾個團伙。
輸入樣例
6 4 1 1 4 0 3 5 0 4 6 1 1 2輸出樣例
3提示
{1},{2,4,6},{3,5}
限制和約定
時間限制:1s
空間限制:128MB
#include<cstdio> #include<iostream> using namespace std; int n,m,f[10010]={0},zt[10010]={0}; int find(int x) {if(x==f[x]) return x;else return f[x]=find(f[x]); } void merge(int x,int y) {int rx=find(x);int ry=find(y);if(rx!=ry) f[rx]=ry; } int main() {int ch,x,y,ans(0);cin>>n>>m;for(int i=1;i<=n;i++){f[i]=i;}for(int i=1;i<=m;i++){cin>>ch;if(ch==1){cin>>x>>y;if(zt[x]==0) {zt[x]=y;}if(zt[y]==0) {zt[y]=x;}merge(zt[x],y);merge(zt[y],x);}if(ch==0){cin>>x>>y;merge(x,y);}}for(int i=1;i<=n;i++) if(find(i)==i) ans++;cout<<ans;return 0; }?
轉載于:https://www.cnblogs.com/hfang/p/11240002.html
總結