Input The first line of the input contains an integer n (0 ≤ n ≤ 100 000) - the number of direct friend-pairs. The following n lines each contains a pair of numbers A and B separated by a single space that suggests A and B are direct friends. (A ≠ B, 1 ≤ A, B ≤ 10000000)
Output The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
Sample Input 4 1 2 3 4 5 6 1 6 4 1 2 3 4 5 6 7 8
Sample Output 4 2 Hint A 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. 这个是裸的并查集,就是求几个并查集中的空间最大的数,也就是求其中结点数最多的一个并查集里面的结点的个数。注意扎实基础。 C++代码: #include<iostream> #include<cstdio> using namespace std; const int maxn = 10000004; int father[maxn],num[maxn]; int maxm; int Find(int x){ while(x != father[x]){ father[x] = father[father[x]]; x = father[x]; } return x; } void Union(int a,int b){ int ax = Find(a); int bx = Find(b); if(ax!=bx){ father[ax] = bx; num[bx] += num[ax]; //注意这是以bx为根的,所以当然要让num[bx]增加。 if(maxm < num[bx]){ maxm = num[bx]; } } } int main(){ int T; while(~scanf("%d",&T)){ if(T == 0){ cout<<1<<endl; continue; } for(int i = 1; i < 10000001; i++){ father[i] = i; num[i] = 1; } int a,b; maxm = -1; for(int i = 1; i <= T; i++){ scanf("%d%d",&a,&b); Union(a,b); } cout<<maxm<<endl; } return 0; }
转载于:https://www.cnblogs.com/Weixu-Liu/p/10908631.html
相关资源:JAVA上百实例源码以及开源项目