首先什么是并查集:
并查集(Union Find)是一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组。
并查集的学习:
https://blog.csdn.net/luomingjun12315/article/details/47373345
http://acm.hdu.edu.cn/showproblem.php?pid=1213
#include<iostream> using namespace std; int node[1050]; int deep[1050]; int sum; void Init(int n) { for(int i=1;i<=n;i++) { node[i]=i; deep[i]=0; } } int Find(int x) { if(x==node[x]) return x; return node[x]=Find(node[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; sum--; if(deep[x]<deep[y]) node[x]=y; else { node[y]=x; if(deep[x]==deep[y]) deep[x]++; } } int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; sum=n; Init(n); for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; Union(x,y); } cout<<sum<<endl; } return 0; }
http://poj.org/problem?id=1611
#include<iostream> using namespace std; int node[30050],deep[30050],num[30050]; void Init(int n) { for(int i=0;i<n;i++) { node[i]=i; deep[i]=0; num[i]=1; } } int Find(int x) { if(x==node[x]) return x; return node[x]=Find(node[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; if(deep[x]<deep[y]) { node[x]=y; num[y]+=num[x]; } else { node[y]=x; num[x]+=num[y]; if(deep[y]==deep[x]) deep[x]++; } } int main() { int n,m; while(cin>>n>>m) { if(n==0&&m==0) break; Init(n); while(m--) { int t,x,y; cin>>t; cin>>x; for(int i=1;i<t;i++) { cin>>y; Union(x,y); x=y; } } int ans=Find(0); cout<<num[ans]<<endl; } return 0; }
http://poj.org/problem?id=2236
#include<iostream> #include<cstring> using namespace std; int node[1050],xy[1050][2],deep[1050]; bool vis[1050];//注意遍历的使用 void Init(int n) { for(int i=1;i<=n;i++) { node[i]=i; deep[i]=0; } } int Find(int x) { if(x==node[x]) return x; else return node[x]=Find(node[x]); } void Union(int m,int n,int d) { for(int i=1;i<=n;i++) { if(vis[i]&&((xy[i][0]-xy[m][0])*(xy[i][0]-xy[m][0])+(xy[i][1]-xy[m][1])*(xy[i][1]-xy[m][1]))<=d*d) { int x=Find(i); int y=Find(m); if(x==y) continue; if(deep[x]<deep[y]) { node[x]=y; } else { node[y]=x; if(deep[x]==deep[y]) deep[x]++; } } } } int main() { int n,d,m,p; while(cin>>n>>d) { Init(n); memset(vis,false,sizeof(vis)); char s; for(int i=1;i<=n;i++) { cin>>xy[i][0]>>xy[i][1]; } // getchar(); while(cin>>s) { if(s=='O') { cin>>m; // getchar(); vis[m]=true; Union(m,n,d); } else { cin>>m>>p; // getchar(); if(vis[m]&&vis[p]&&Find(m)==Find(p)) cout<<"SUCCESS"<<endl; else cout<<"FAIL"<<endl; } } } return 0; }