标签:des blog http java strong art
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 12538 Accepted Submission(s): 6145
========================================================
题意很容易懂,就是求总体有多少祖先,具体看代码吧
如果你什么都不知道,就看看这里的文章吧
http://zh.wikipedia.org/zh-cn/%E5%B9%B6%E6%9F%A5%E9%9B%86
http://www.cnblogs.com/cyjb/p/UnionFindSets.html
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#define Maxsize 1005
int uset[Maxsize];//祖先节点
int rank[Maxsize];
void Markset(int size)
{
for(int i=1;i<=size;i++)//初始化
{
uset[i]=i;//每个点有独自的祖先
rank[i]=0;
}
}
int find(int x)//查找祖先
{
if(x!=uset[x])
uset[x]=find(uset[x]);//递归全指向祖先
return uset[x];
}
void Union(int x,int y)
{
x=find(x);
y=find(y);
if(x == y)
return ;
if(x!=y)//不是一个家族
{
uset[x]=find(y);//合并,就是把y的祖先当x的孙子^^
}
}
int main()
{
int t,n,m;
int a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
Markset(n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
Union(a,b);//合并两家祖先
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(uset[i]==i)//查看有多少祖先
sum++;
}
printf("%d\n",sum);
}
return 0;
}
标签:des blog http java strong art
原文地址:http://www.cnblogs.com/ccccnzb/p/3833823.html