05-樹8 File Transfer【並查集】
阿新 • • 發佈:2019-02-08
題意:輸入形式有3種:“I a b"代表:a,b可連通 ;“C a b”代表:查詢a,b是否連通 ;“S”代表結束。輸出查詢是否連通即可。
思路:基本的並查集操作!
程式碼:
#include <cstdio> #include <cstring> const int maxn = 10005; int f[maxn]; void init(int n){ for(int i=0;i<=n;i++) f[i] = i; } inline int find(int v){ if(f[v] != v) f[v] = find(f[v]); return f[v]; } inline void merge(int u,int v){ int tu = find(u); int tv = find(v); if(tu != tv) f[tv] = tu; } int main(){ int n,u,v; char s[5]; while(scanf("%d",&n)!=EOF){ init(n); while(scanf("%s",s) && s[0] != 'S'){ scanf("%d%d",&u,&v); if(s[0] == 'I') merge(u,v); else{ if(find(u) == find(v)) printf("yes\n"); else printf("no\n"); } } int cnt = 0; for(int i=1;i<=n;i++){ if(f[i] == i) cnt++; } if(cnt > 1) printf("There are %d components.\n",cnt); else printf("The network is connected.\n"); } }