在某个江湖中,相互认识的人会加入同一个门派,而互不认识的人不会加入
相同的门派。若甲认识乙,且乙认识丙,那么甲和丙就算是认识的。对于给定的
认识关系,请计算共有多少个门派,人数最多的门派有多少人。
输入格式:
首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测
试首先输入两个整数n、m(1≤n≤1000,1≤m≤n(n-1)/2),n表示总人数,m
表示认识关系数。然后输入m行,每行两个整数A、B(1≤A,B≤1000,且A!=B),
表示编号为A、B的两人互相认识。
输出格式:
对于每组测试,输出门派总数和人数最多的门派拥有的人数。
输入样例:
2
53
12
23
45
51
25
输出样例:
23
42
还有没有会做的大佬,现在还没有解答出来,可以商量一下,比较着急
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int r[1001] = {0}; //所有人是否在关系中的标志
int mps = 0; //门派数量
int mp[1000]; //门派人数
void addR(int p,int q) //将每个关系中的两个人加入门派
{
if(r[p] == 0 && r[q] == 0) //如果两人都没加入门派,增加新门派
{
mps++;
r[p] = mps;
r[q] = mps;
mp[mps] = 2;
}
else if(r[p] == r[q]) //如果在同一门派,啥也不做
{
}
else if(r[p] == 0)//如果p不在门派,则p加入q门派,q门派人数加1
{
r[p] = r[q];
mp[r[q]]++;
}
else if(r[q] == 0)
{
r[q] = r[p];
mp[r[p]]++;
}
else //如果p和q不在一个门派,则要门派合并
{
int m = r[q];
for(int i=0;i<1000 && mp[m]>0;i++)
{
if(r[i] == m)
{
r[i] = r[p];
mp[m]--;
mp[r[p]]++;
}
}
}
}
int main()
{
int m;
scanf("%d",&m); //测试组数
for(int i=0;i<m;i++)
{
memset(r,0,sizeof(r));
int a,b;
scanf("%d%d",&a,&b);//a为人数,b为关系数
for(int j=0;j<b;j++)
{
int p,q; //每个关系中的两个人
scanf("%d%d",&p,&q);
addR(p,q);
}
int as = 0,max=0;
for(int j=1;j<=mps;j++)
{
if(mp[j] != 0)
as++;
if(mp[j] > max)
max = mp[j];
}
for(int j=1;j<=a;j++)
if(r[j] == 0)
as++;
printf("%d %d\n",as,max);
}
system("pause");
return 0;
}
# include <stdio.h>
int main()
{
int T; //需要测试组数
printf("请输入需要测试组数:");
scanf("%d",&T);
int all[T]; //门派总数
int max[T]; //最多的门派拥有的人数
int i;
for(i=0;i<T;i++)
{
all[i]=0;
max[i]=0; //先给门派总数和最多门派人数赋予初始值0
int k;
int j;
int n; //人数
int m; //认识关系数
printf("\n***第%d组***\n",i+1);
printf("总人数:");
scanf("%d",&n);
printf("认识关系数:");
scanf("%d",&m);
int N[n]; //创建一个数组,数组中每个元素代表每个人
for(j=0;j<n;j++)
{
N[j]=j+1; //先给每个人编号
}
int m1 , m2; //m1,m2代表认识的两个人
for(j=0;j<m;j++) //我们将用这个循环输入m组认识的人
{
printf("第%d个认识关系:",j+1);
scanf("%d %d",&m1,&m2);
for(k=0;k<n;k++)
{
if(N[k]==m1)
N[k]=m2; //这个循环,我们是让所有与m1认识的人都认识m2,我们最终保证所有认识的人编号相同
}
}
for (j=0;j<n;j++)
{
if(N[j]==j+1) //即如果编号没有被修改
all[i]++; //前面已经让认识的人编号相同了,因此这里可以统计出总门派数
}
for(j=0;j<n;j++)
{
int h=0;
for(k=0;k<n;k++)
{
if(N[k]==j+1)
h++; //统计当前门派的人数
}
if(max[i]<h) //如果最大门派人数小于当前门派数
{
max[i]=h;
}
}
}
for(i=0;i<T;i++)
{
printf("\n第%d组门派总数为:%d,最大门派人数为%d\n",i+1,all[i],max[i]);
}
}