则最后的集合数量即为结果。求集合数量:判断有多少个根节点,用到根节点的特征(其父节点为自己)
代码如下:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m; int f[52014]; void init() { for(int i=1; i<=n; i++) f[i]=i; } int find(int x) { return f[x]==x?x:find(f[x]); } void unity(int a,int b) { if(find(a)!=find(b)) f[find(a)]=find(b); } int main() { int ji=1; while(cin>>n>>m) { if(n+m==0)break; init(); while(m--) { int a,b; cin>>a>>b; unity(a,b); } int ans=0; for(int i=1; i<=n; i++) if(f[i]==i) ans++; cout<<"Case "<<ji++<<": "; cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/u014004096/article/details/39010585