hdu1856 More is better 并查集

本文介绍了一个使用并查集算法解决的最大朋友圈问题。问题描述为:在一系列已知的朋友关系中找到最大朋友圈的人数。通过并查集将直接或间接的朋友关系进行合并,并找出人数最多的朋友圈。

More is better

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)
Total Submission(s): 25399    Accepted Submission(s): 9110


Problem Description
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.
 

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.
 

Author
lxlcrystal@TJU
 

Source

当天晚上脑袋真是被门夹了居然看出来了这个是并查集。。。。

题意:

有个人想要举办哲学party,由于这个是哲学party,所以希望男人越多越好,题目会告诉你m对关系,表示a和b是朋友,现在房间的主人要依次从房间里踢人,知道房间内任意两个人是朋友(直接或间接)

那肯定是剩下一个最大的团啊。。。。。那不就是并查集吗?!直接查一查,然后看看谁的子孙最多啊

虽然看那个点给的范围可能会超。。。。反正就写写写,。。。。。

然后特判一下m==0

然后就。。。没了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 10000010;
int pre[N],judge[N];
int maxn,ans;
int Find(int index){
    int r=index;
    while(pre[r]!=r){
        r=pre[r];
    }
    if(pre[index]!=r){
        pre[index]=r;
    }
    return r;
}
void join(int a,int b){
    int i=Find(a);
    int j=Find(b);
    if(i!=j){
        pre[i]=j;
        judge[j]+=judge[i];
    }
}
int main(){
    int n,a,b,maxn;
    while (~scanf("%d",&n)) {
        ans = 1;
        maxn = 0;
        for(int i=1;i<N;i++){
            pre[i] = i;
            judge[i] = 1;
        }
        for(int i=0;i<n;i++){
            scanf("%d%d",&a,&b);
            maxn = max(maxn,max(a,b));
            join(a, b);
        }
        for(int i=1;i<=maxn;i++){
            ans = max(ans,judge[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值