标签:
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 18707 Accepted Submission(s):
6873
1 #include <iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #define maxn 100000 6 using namespace std; 7 int ran[maxn],per[maxn],via[maxn],num[maxn],n,sum; 8 void init() 9 { 10 int i; 11 for(i=1;i<=maxn;i++) 12 { 13 per[i]=i; 14 num[i] = 1;//记录每个根节点所包含的子节点 15 } 16 } 17 int find(int x)//查找函数 18 { 19 int t=x; 20 while(t!=per[t]) 21 t=per[t]; 22 int i=x,j; 23 while(i!=t) 24 { 25 j=per[i]; 26 per[i]=t; 27 i=j;//压缩路径 28 } 29 return t; 30 } 31 void join(int x,int y)//合并函数,合并图 32 { 33 int fx=find(x); 34 int fy=find(y); 35 if(fx!=fy) 36 { 37 per[fx] = fy; 38 num[fy] += num[fx]; 39 sum = max(sum, num[fy]);//求出各个树中子节点最多的 40 } 41 else 42 return ; 43 } 44 int main () 45 { 46 int a,b,i,w,n; 47 while(scanf("%d",&n)!=EOF) 48 { 49 if(n == 0){ 50 printf("1\n");//特殊坑爹数据 51 continue; 52 } 53 init(); 54 w=n; 55 sum = 0; 56 while(w--) 57 { 58 scanf("%d%d",&a,&b); 59 via[a]=1; 60 via[b]=1; 61 join(a,b); 62 } 63 printf("%d\n", sum); 64 } 65 return 0; 66 }
标签:
原文地址:http://www.cnblogs.com/Eric-keke/p/4687283.html