题目链接: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