问题 D: 家庭问题

问题 D: 家庭问题


时间限制: 1 Sec  内存限制: 128 MB
[命题人:admin]

题目描述

有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行,每行二个整数(用空格分隔)表示关系

输出

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

样例输入 Copy

6 3
1 2
1 3
4 5

样例输出 Copy

3 3
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map> 
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll; 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int maxn=1e5;
int pre[maxn]; 
int find(int x){
    return pre[x]==x?x:find(pre[x]);
}
void merge(int v,int u){
    int t1,t2;
    t1=find(v);
    t2=find(u);
    if(t1!=t2){
        pre[t1]=t2;
    } 
}
int n,m;
int vis[maxn];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        pre[i]=i;
    }
    int x,y;
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        merge(x,y);
    }
    int ans=0;
    int max1=0;
    for(int i=1;i<=n;i++){
        int p=find(i);
        if(vis[p]==0){
            vis[p]++;
            max1=max(max1,vis[p]);
            ans++;//家庭个数 
        }
        else{
            vis[p]++;
            max1=max(max1,vis[p]);
        } 
    }
    printf("%d %d",ans,max1);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lipu123/p/12334608.html