您的位置:首页 > 其它

nyist 608 并查集模板

2013-04-21 16:15 204 查看
#include<stdio.h>
int father[1005];
int find(int x)     //寻找集合的祖先
{
if(x==father[x])
return father[x];
return father[x] = find(father[x]);//路径压缩

}
void merge(int a,int b)     //合并集合
{
int G = find(a);
int H = find(b);
father[G] = H;         }
int main()
{
int N,M,n,m;

while(scanf("%d",&N)!=EOF,N)
{    scanf("%d",&M);
int sum = 0;
for(int i=1;i<=N;i++)
father[i] = i;
for(int j=0;j<M;j++)
{
scanf("%d%d",&n,&m);
merge(n,m);
}
for(int s=1;s<=N;s++)
{
if(father[s]==s) sum++;
}

printf("%d\n",sum-1);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: