【模板】并查集
- 版本一 那时候的我大括号还换行qwq
![](https://images2018.cnblogs.com/blog/1291641/201808/1291641-20180821151630928-1102134398.png)
1 #include<cstdio> 2 #include<iostream> 3 #define maxn 10010 4 #define maxm 200020 5 int f[maxn]; 6 int n,m; 7 inline int find(int x) 8 { 9 if(x!=f[x]) f[x]=find(f[x]); 10 return f[x]; 11 } 12 inline void merge1(int u,int v) 13 { 14 int r1=find(u); 15 int r2=find(v); 16 if(r1!=r2) 17 { 18 f[r2]=r1; 19 } 20 return; 21 } 22 inline bool merge2(int u,int v) 23 { 24 int r1=find(u); 25 int r2=find(v); 26 if(r1!=r2) return false; 27 return true; 28 } 29 using namespace std; 30 int main() 31 { 32 scanf("%d%d",&n,&m); 33 for(int i=1;i<n;i++) f[i]=i; 34 int pd,x,y; 35 for(int i=1;i<=m;i++) 36 { 37 scanf("%d",&pd); 38 if(pd==1) 39 { 40 scanf("%d%d",&x,&y); 41 merge1(x,y); 42 } 43 else 44 { 45 scanf("%d%d",&x,&y); 46 if(merge2(x,y)==true) cout<<"Y"<<endl; 47 else cout<<"N"<<endl; 48 } 49 } 50 return 0; 51 }
- 版本二 现在的我喜欢短短萌萌的代码qwq
-
1 1 #include<cstdio> 2 2 #include<iostream> 3 3 #define maxn 10010 4 4 #define maxm 200020 5 5 using namespace std; 6 6 int f[maxn]; 7 7 int n,m,x,y,z; 8 8 bool pd = 0; 9 9 void init(int s) {for(int i = 1; i <= s; i++) f[i] = i;} 10 10 int find(int x) { 11 11 if(x != f[x]) f[x] = find(f[x]); 12 12 return f[x]; 13 13 } 14 14 void merge(int r1, int r2) {f[r2] = r1;} 15 15 int main() { 16 16 scanf("%d%d",&n,&m); 17 17 init(n); 18 18 for(int i = 1; i <= m; i++) { 19 19 scanf("%d%d%d",&z,&x,&y); 20 20 int f1 = find(x), f2 = find(y); 21 21 if(z == 1) merge(f1,f2); 22 22 else (f1 == f2)?printf("Y\n"):printf("N\n");//原来一直不喜欢用:? 当然现在也不喜欢qwq 23 23 } 24 24 return 0; 25 25 }
- 洛谷提交破千万啦!撒花!
- 让我们一起祝贺洛谷长大啦!是个大宝宝啦!
总之岁月漫长,然而值得期待。