并查集 简单题
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define N 10000005 5 using namespace std; 6 int par[N]; 7 int M[N]; 8 int Find(int x) 9 { 10 if(par[x] == x) 11 return x; 12 else 13 par[x] = Find(par[x]); 14 return par[x]; 15 } 16 void Union(int x,int y) 17 { 18 int a=Find(x); 19 int b=Find(y); 20 if(a != b) 21 { 22 if(M[a] >= M[b]) // 这就是要比较了 23 { 24 par[b] = a; 25 M[a] += M[b]; 26 } 27 else 28 { 29 par[a] = b; 30 M[b] += M[a]; 31 } 32 } 33 else 34 return ; 35 } 36 int main() 37 { 38 freopen("input.txt","r",stdin); 39 int i,x,y,n; 40 while(scanf("%d",&n)!=EOF) 41 { 42 for(i = 0;i <= N; i++) // 最早的初始化 43 { 44 par[i] = i; 45 M[i] = 1; 46 } 47 for(i = 1; i <= n; i++) 48 { 49 scanf("%d%d",&x,&y); 50 Union(x,y); 51 } 52 int Max = -1; 53 for(i = 0; i <= N; i++) 54 if(M[i] > Max) 55 Max = M[i]; // 找出亲戚数最多的那个数字max,输出 56 printf("%d ",Max); 57 58 } 59 return 0; 60 }