标签: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