2597 團伙(並查集)
阿新 • • 發佈:2018-12-07
題目描述 Description
1920年的芝加哥,出現了一群強盜。如果兩個強盜遇上了,那麼他們要麼是朋友,要麼是敵人。而且有一點是肯定的,就是:
我朋友的朋友是我的朋友;
我敵人的敵人也是我的朋友。
兩個強盜是同一團伙的條件是當且僅當他們是朋友。現在給你一些關於強盜們的資訊,問你最多有多少個強盜團伙。
輸入描述 Input Description
輸入檔案gangs.in的第一行是一個整數N(2<=N<=1000),表示強盜的個數(從1編號到N)。 第二行M(1<=M<=5000),表示關於強盜的資訊條數。 以下M行,每行可能是F p q或是E p q(1<=p q<=N),F表示p和q是朋友,E表示p和q是敵人。輸入資料保證不會產生資訊的矛盾。
輸出描述 Output Description
輸出檔案gangs.out只有一行,表示最大可能的團伙數。
樣例輸入 Sample Input
6
4
E 1 4
F 3 5
F 4 6
E 1 2
樣例輸出 Sample Output
3
資料範圍及提示 Data Size & Hint
2<=N<=1000
1<=M<=5000
1<=p q<=N
分類標籤 Tags 點此展開
思路:利用e陣列記錄該強盜的敵人,如果e[x]不為0,則說明x存在敵人為e[x],此時y就和e[x]為朋友,合併即可。
#include<stdio.h> #include<iostream> #include<string> #include<math.h> #include<algorithm> using namespace std; int pre[1001],e[1001]; void init(int n) { for(int i=1;i<=n;i++) { pre[i]=i; e[i]=0; } } int find(int x) { if(pre[x]==x) return x; else return pre[x]=find(pre[x]); } void join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) pre[fx]=fy; } int main() { int n; cin>>n; init(n); int t; cin>>t; while(t--) { char c; int a,b; cin>>c>>a>>b; if(c=='E') { if(e[a]) { join(e[a],b); } if(e[b]) { join(e[b],a); } e[a]=b; } else { join(a,b); } } int ans=0; for(int i=1;i<=n;i++) { if(pre[i]==i) ans++; } cout<<ans<<endl; return 0; }