家庭问题(family)

家庭问题(family)

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1362
时间限制: 1000 ms         内存限制: 65536 KB
 

【题目描述】

有n个人,编号为1,2,……n,另外还知道存在K个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。

当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人?

例如:n=6,k=3,三个关系为(1,2),(1,3),(4,5)

此时,6个人组成三个家庭,即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为一个家庭,第一个家庭的人数为最多。

 

【输入】

第一行为n,k二个整数(1≤n≤100)(用空格分隔);

接下来的k行,每行二个整数(用空格分隔)表示关系。

 

【输出】

二个整数(分别表示家庭个数和最大家庭人数)。

【输入样例】

6  3
1  2
1  3
4  5

【输出样例】

3 3
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
bool a[205];
int mp[205][205];
queue <int>Q;
int n;
void bfs(int k)
{
    a[k]=1;
    Q.push(k);
    while(!Q.empty())
    {
        int u=Q.front();
        Q.pop();
        for(int i=1;i<=n;i++)
            if(!a[i]&&mp[u][i])
            {
                a[i]=1;
                mp[k][i]=1;
                Q.push(i);
            }
    }
}
int main()
{
    int k,t=0,ans=0,cnt=1;
    cin>>n>>k;
    for(int i=1;i<=k;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        mp[u][v]=mp[v][u]=1;
    }
    for(int i=1;i<=n;i++)
        if(!a[i])
            bfs(i);
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
    {
        cnt=1;
        if(!a[i])
        {
            a[i]=1;t++;
            for(int j=i+1;j<=n;j++)
            {
                if(!a[j]&&mp[i][j])
                    a[j]=1;cnt++;
            } 
            ans=max(ans,cnt);
        }
            
    }
    cout<<t<<" "<<ans<<endl;
}
原文地址:https://www.cnblogs.com/EdSheeran/p/8017908.html