hdu1856(并查集)
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 int set[10000005]; 5 int num[10000005]; 6 7 int cmp(int a,int b) 8 { 9 return a>b; 10 } 11 12 void makeset() 13 { 14 for(int i=1;i<10000005;i++) 15 { 16 set[i]=i; 17 num[i]=1; 18 } 19 } 20 21 22 int findset(int x)//查 23 { 24 if(x!=set[x]) 25 { 26 set[x]=findset(set[x]);//之所以不可以直接返回是因为这里可能有多层的关系 27 } 28 return set[x]; 29 } 30 void Union(int a,int b)//并 31 { 32 int x=findset(a); 33 int y=findset(b); 34 if(x==y) 35 { 36 return ; 37 } 38 if(num[x]>=num[y]) 39 { 40 num[x]+=num[y]; 41 set[y]=set[x]; 42 } 43 else 44 { 45 num[y]+=num[x]; 46 set[x]=set[y]; 47 } 48 } 49 int main() 50 { 51 int n; 52 int first; 53 int second; 54 while(scanf("%d",&n)!=EOF) 55 { 56 makeset(); 57 for(int i=0;i<n;i++) 58 { 59 scanf("%d %d",&first,&second); 60 Union(first,second); 61 } 62 int max=-100000; 63 for(int i=0;i<10000005;i++) 64 { 65 if(num[i]>max) max=num[i]; 66 } 67 printf("%d\n",max); 68 } 69 return 0; 70 }
好像不难啊,都是模板啊