wzoi越多越好

题目描述:

王先生想要一些男孩帮他做一个项目。 因为这个项目是相当复杂的,需要的男孩越多越好。

当然有一定的要求,王先生要挑选一个足够大的房间来容纳这些男孩。 那些没有被选中的男孩必须马上离开房间。起初房间里有10000000男孩编号分别从1到10000000。 王先生要选择的男孩必须有直接或间接朋友在一起才能留下来,或只留一个男孩(0个朋友关系的时候,也要留下一个)。

现在给定若干对是朋友的编号,你来帮王先生计算一下最后最多能留下多少人。

输入格式:

输入有多组数据,每组测试数据包含:

第一行一个整数n (0 ≤ n ≤ 100 000) - 表示有n对朋友的关系。

接下来n行,每行两个数A、B,用一个空格隔开,表示A与B是直接的朋友关系 (A ≠ B, 1 ≤ A, B ≤ 10000000) 

输出格式:

只有一个数,表示剩下最多的人数。

样例输入:
3
1 3
1 5
2 5
4
3 2
3 4
1 6
2 6
样例输出:
4
5
#include<cstdio>
#include<iostream>
using namespace std;
int s[100005],mark[100005];
int c=1;
int findd(int x)
{
    if(s[x]!=x)
        s[x]=findd(s[x]);
    return s[x];
}
 
void unionn(int x,int y)
{
    int a=findd(x);
    int b=findd(y);
    if(a!=b)
    {
        s[b]=a;
        mark[a]+=mark[b];
        if(mark[a]>c)
            c=mark[a];
    }
}
void init()
{
    for(int i=1;i<=100000;i++)
    {
        s[i]=i;
        mark[i]=1;
    }
}
int main()
{
    int n;
    while(cin >> n)
    {
        c=1;
        init();
        for(int i=1;i<=n;i++)
        {
            int a,b;
            cin >> a >> b;
            unionn(a,b);
        }
 
        cout << c << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值