求一个解答,用c语言解答

在某个江湖中,相互认识的人会加入同一个门派,而互不认识的人不会加入
相同的门派。若甲认识乙,且乙认识丙,那么甲和丙就算是认识的。对于给定的
认识关系,请计算共有多少个门派,人数最多的门派有多少人。
输入格式:
首先输入一个整数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

还有没有会做的大佬,现在还没有解答出来,可以商量一下,比较着急

img

#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]);
    }
}

img