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.
//因为要找最大的,所以用num来记载所有情况,在比较找出最大的
#include <stdio.h> struct A { int num; int pre; } set[10000005]; void bulid(int n) { int i; for(i = 1; i<=n; i++) { set[i].pre = i; set[i].num = 1; } } int find(int x) { if(set[x].pre == x) return x; return set[x].pre = find(set[x].pre); } void Union(int x,int y) { set[x].pre = y; set[y].num+=set[x].num; } int main() { int big,n,f1,f2,i; int x[100005],y[100005]; while(~scanf("%d",&n)) { big = 0; int ans = 0; if(n==0) { printf("1\n"); continue; } for(i = 1; i<=n; i++) { scanf("%d%d",&x[i],&y[i]); if(x[i]>big) big = x[i]; if(y[i]> big) big = y[i]; } bulid(big); for(i = 1; i<=n; i++) { f1 = find(x[i]); f2 = find(y[i]); if(f1!=f2) Union(f1,f2); } for(i = 1; i<=big; i++) { if(set[i].num > ans) ans = set[i].num; } printf("%d\n",ans); } return 0; }