问题 D: 家庭问题
2024-10-08 11:00:56
问题 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=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';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=;i<=n;i++){
pre[i]=i;
}
int x,y;
for(int i=;i<=m;i++){
cin>>x>>y;
merge(x,y);
}
int ans=;
int max1=;
for(int i=;i<=n;i++){
int p=find(i);
if(vis[p]==){
vis[p]++;
max1=max(max1,vis[p]);
ans++;//家庭个数
}
else{
vis[p]++;
max1=max(max1,vis[p]);
}
}
printf("%d %d",ans,max1);
return ;
}
最新文章
- Latex制作beamer
- 使用NVelocity生成内容的几种方式
- 工程源码github地址
- docker 换更优秀的 文件系统 比如 OverlayFS(centos7 overlay2)
- “Guess the number” game
- 1. VS2010---简介
- ***用php的strpos() 函数判断字符串中是否包含某字符串的方法
- oc语言--BLOCK和协议
- AndroidStudio中导入module(简单版)
- Spring Boot的日志配置
- React Fiber源码分析 第二篇(同步模式)
- maven配置jdk1.8环境
- linux centos6.8搭建 jdk 环境
- 移动端(微信等)使用 vConsole 调试 console
- File available()方法
- Swift与OC代码转换实例
- Android Material Design控件学习(二)——NavigationView的学习和使用
- TOMCAT Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
- Jetty源码解析(web.xml的处理机制)
- Linux 优化详解