问题 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行,每行二个整数(用空格分隔)表示关系
接下来的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; }