• 问题 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;
    }
  • 相关阅读:
    分布式事务--AT+TCC
    Java基础面试题
    JVM问题
    集合问题
    线程问题
    微服务面试题
    【入职准备】安装STS以及整合maven
    事务----四大特性
    html小知识--创建表单
    通过css润色html表格
  • 原文地址:https://www.cnblogs.com/lipu123/p/12334608.html
Copyright © 2020-2023  润新知