标签:
2 5 3 1 2 2 3 4 5 5 1 2 5
2 4
1.可以求出一共有多少个根节点(即fa[i]==-1的i个数)
2.可以用原始连通分量数n 减去 有效的合并次数。
即每次合并两个连通分量就会使得总的分量数目减少1.
#include <iostream> #include <cstring> using namespace std; const int maxn=1000+10; int fa[maxn]; int Find(int x) { if(fa[x]==-1) return x; return fa[x]=Find(fa[x]); } void mix(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) fa[fx]=fy; //return ; } int main() { int t,n,m,x,y; cin>>t; while(t--) { cin>>n>>m; memset(fa,-1,sizeof(fa)); while(m--) { cin>>x>>y; mix(x,y); } int ans=0; for(int i=1;i<=n;i++) { if(fa[i]==-1) ans++; } cout<<ans<<endl; } }
#include <iostream> #include <cstring> using namespace std; const int maxn=1000+5; int fa[maxn]; int Find(int x) { if(fa[x]==-1) return x; return fa[x]=Find(fa[x]); } int mix(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) { fa[fx]=fy; return 1; } return 0; } int main() { int t,n,m,x,y; cin>>t; while(t--) { cin>>n>>m; memset(fa,-1,sizeof(fa)); int ans=n; while(m--) { cin>>x>>y; ans-=mix(x,y); } cout<<ans<<endl; } return 0; }
HDU 1213 How Many Tables (并查集,连通分支数,两种方式)
标签:
原文地址:http://blog.csdn.net/hurmishine/article/details/51623118