HDOJ 1856
1 #include<cstdio> 2 #include<cstdlib> 3 typedef struct ufse *ufset; 4 struct ufse 5 { 6 int parent[1000001]; 7 int root[1000001]; 8 }UFS; 9 int max; 10 int find(int e,ufset u) 11 { 12 if(e!=u->parent[e]) 13 u->parent[e]=find(u->parent[e],u);//递归缩短路径 14 return u->parent[e]; 15 } 16 void ufnion(int i,int j,ufset u) 17 { 18 if(i!=j) 19 { 20 u->parent[i]=j; 21 u->root[j]+=u->root[i]; 22 if(u->root[j]>max) 23 max=u->root[j]; 24 } 25 } 26 27 int main() 28 { 29 ufset u; 30 int i; 31 u=(ufset)malloc(sizeof(UFS)); 32 33 int n,a,b; 34 while(scanf("%d",&n)!=EOF) 35 { 36 for(i=1;i<=1000000;i++) 37 u->parent[i]=i, 38 u->root[i]=1; 39 max=1; 40 for(i=0;i<n;i++) 41 { 42 scanf("%d %d",&a,&b); 43 ufnion(find(a,u),find(b,u),u); 44 } 45 printf("%d\n",max); 46 } 47 return 0; 48 }
用到递归缩短路径!并查集新思路!