题目描述:
Mr Wang wants some boys to help him with a project. Because the project is rather complex, the more boys come, the better it will be. Of course there are certain requirements.
Mr Wang selected a room big enough to hold the boys. The boy who are not been chosen has to leave the room immediately. There are 10000000 boys in the room numbered from 1 to 10000000 at the very beginning. After Mr Wang’s selection any two of them who are still in this room should be friends (direct or indirect), or there is only one boy left. Given all the direct friend-pairs, you should decide the best way.
输入描述:
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)
输出描述:
The output in one line contains exactly one integer equals to the maximum number of boys Mr Wang may keep.
输入:
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
输出:
4
2
题意:
最初,这1e7个人在一个房间里,可以让一些人离开房间,使得最终这个房间剩下的人都互为朋友(直接或间接的都可以,即a和b是朋友,b和c是朋友,那么房间里最后可以剩下a,b,c), 给定n个直接的朋友关系,求最多能找到多少人帮他完成作业,即最后房间里最多能剩下多少人。
简单地说,给定n个直接的朋友关系,求一个最大的集合,使这个集合里的所有人都直接或间接的满足朋友关系,求这个集合的大小。
题解:
并查集模板题
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 10000000 + 5;
int n,m;
int f[maxn],vis[maxn];
void init(){
for(int i = 0; i <= 10000000; i ++){
f[i] = i;
}
}
int findset(int x){
if(x != f[x]){
f[x] = findset(f[x]);
}
return f[x];
}
int main(){
int x,y;
while(scanf("%d",&n)!=EOF){
int ans = 0;
memset(vis,0,sizeof(vis));
init();
for(int i = 1; i <= n; i ++){
scanf("%d%d",&x,&y);
int fx = findset(x);
int fy = findset(y);
if(fx != fy){
f[fx] = fy;
}
}
for(int i = 0; i <= 10000000; i ++){
int t = findset(i);
vis[t] ++;
}
for(int i = 0; i <= 10000000; i ++){
ans = max(ans,vis[i]);
}
printf("%d\n",ans);
}
return 0;
}