题目链接: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){
while(x!=father[x]){ //路径压缩迭代版
father[x]=father[father[x]];
x=father[x];
}
return father[x];
}
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){ //只剩下一个人的时候, pair数是0, 人数是1;
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);
}
int max=0;
for(int i=1;i<=Max;i++){
if(num[i]>max)
max=num[i];
}
printf("%d\n",max);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/chaiwenjun000/article/details/47405999