这个是根据并查集的知识,直接套用并查集模板,是一个比较简单的题目。
该知识的相关内容:http://blog.csdn.net/zuojx1013/article/details/8530607
#include <iostream>
#include <map>
using namespace std;
int father[50001];
int search_father(int tar) //查
{
int result=tar;
while(result!=father[result]) //是否根节点
{
result=father[result]; //不是,建立根节点
}
return result; //是,直接返回
}
void combine_tree(int a,int b) //并
{
int fx=search_father(a);
int fy=search_father(b);
if(fx!=fy)
father[fx]=fy;//合并父节点
}
int main()
{
int n,m;
int cc=0;
while(cin>>n>>m&&m!=0,n!=0)
{
cc++;
for(int i=0;i<n;i++)
father[i]=i;
while(m--)
{
int x,y;
cin>>x>>y;
combine_tree(x,y);
}
int ans=0;
for(int i=0;i<n;i++)
{
if(father[i]==i)
ans++;
}
cout<<"Case "<<cc<<": "<<ans<<endl;
}
return 0;
}