1 条题解
-
0
C :
#include<stdio.h> int xx[200]={0},t=1,n; void he(int n,int m){ if(xx[n]==0&&xx[m]==0) xx[n]=xx[m]=t++; else if(xx[n]==0) xx[n]=xx[m]; else if(xx[m]==0) xx[m]=xx[n]; else{ for(int i=0;i<=n;i++) if(m!=i&&xx[i]==xx[m]) xx[i]=xx[n]; xx[m]=xx[n]; } } int main(){ int x1,x2,k,i,cc[1000]={0},m1; scanf("%d%d",&n,&k); for(i=0;i<k;i++){ scanf("%d%d",&x1,&x2); he(x1,x2); } for(i=1;i<=n;i++) cc[xx[i]]++; for(i=1;i<1000;i++){ if(cc[i]!=0)cc[0]++; if(cc[i]>m1)m1=cc[i]; } if(m1==0)m1=1; printf("%d %d\n",cc[0],m1); return 0; }C++ :
/*21174: 家庭问题 时间限制: 1 Sec 内存限制: 128 MB 题目描述 有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<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,k,ans,ans1; int a[105],book[105]; int getfa(int i){ if(i==a[i]){ return i; } a[i]=getfa(a[i]); return a[i]; } int main(){ cin>>n>>k; for(int i=1;i<=n;i++){ a[i]=i; } for(int i=1;i<=k;i++){ int x,y; cin>>x>>y;//两者有联系 x=getfa(x); y=getfa(y); a[y]=x;//靠左合并 } for(int i=1;i<=n;i++){ a[i]=getfa(a[i]); if(!book[a[i]]){//ans:新的家庭 book[a[i]]=1; ans++; } else{ book[a[i]]++; } if(book[a[i]]>ans1){ ans1=book[a[i]];//ans1:家庭成员 } } cout<<ans<<' '<<ans1; return 0; }
- 1
信息
- ID
- 1411
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者