题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856
4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
4 2HintA and B are friends(direct or indirect), B and C are friends(direct or indirect), then A and C are also friends(indirect). In the first sample {1,2,5,6} is the result. In the second sample {1,2},{3,4},{5,6},{7,8} are four kinds of answers.
一定要细致看题目啊!
!!
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)
时间限制尽管在1s 可是内存放的非常宽啊!
。 所以什么数组存不下等等的顾虑都抛开吧,大胆的开数组!
【代码】
#include <cstdio>
const int maxn= 10000000+10;
int father[maxn];
int num[maxn];
int Find(int x){ //路径压缩迭代版本号
int root = x;
while(root!=father[root])
root = father[root];//肇东根节点
while(x!=root){ //将这棵树上的节点都指向根节点
int tmp = father[x];
father[x] = root;
x= tmp;
}
return root;
}
void Union(int a,int b){
int p=Find(a);
int q=Find(b);
if(p!=q){
father[p]=q;
num[q]+=num[p]; //将合并后的数量加到 父节点上
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
if(n==0){
puts("1");continue;
}
for(int i=1;i<=maxn;i++){
num[i]=1;
father[i]=i;
}
int a,b;
int Max=0;
for(int i=0;i<n;i++){
scanf("%d%d",&a,&b);
if(a>Max)
Max=a;
if(b>Max)
Max=b;
Union(a,b);
}
//printf("sd");
int max=0;
for(int i=1;i<=Max;i++){
if(num[i]>max)
max=num[i];
// printf("bug\n");
}
printf("%d\n",max);
}
return 0;
}原文:http://www.cnblogs.com/yxysuanfa/p/7219736.html