思路:在博客园里,有对并查集思路的详解,模板神马的只是饭后甜点;
这儿有只野生模板君飘过,请各位OIer尽快捕捉
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,x,y,fa[10000],v[10000],sum; int find(int x) { if(fa[x]!=x) return fa[x]=find(fa[x]); else return fa[x]; } int unionn(int r1,int r2) { fa[r2]=r1; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;i++) { cin>>x>>y; int r1=find(x); int r2=find(y); if(r1!=r2) unionn(r1,r2); } //操作 <1>: /*cin>>q; for(int i=1;i<=q;i++){ cin>>a>>b; if(find(a)==find(b)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } 查询两个元素是否存在奇怪的关系(eg:子孙,上下级,徒孙······)。*/ //操作 <2>: /*for(int i=1;i<=n;i++) v[find(i)]++; for(int i=1;i<=n;i++){ if(v[i]!=1){ sum++; } } cout<<sum; 统计不同集合的个数,并统计每个集合中元素的个数。*/ }