暖色空铃 2022-04-11 23:32 采纳率: 76.9%
浏览 54
已结题

部落:此代码部分正确

img


#include<stdio.h>
#include<string.h>
#include <stdlib.h>
int p[10000],k[10000],f[10001],tep[10001];
void init(int n);
int getFriend(int v);
void merge(int a, int b);
int greater(const void *a,const void *b){
int *pa,*pb;
pa = (int *)a;
pb = (int *)b;
return *pa - *pb;
}
int max=0;
int main()
{
int n,q,x,y;
int sum=0;
scanf("%d",&n);
init(10001);
for(int i=0;i<n;i++)
{
scanf("%d",&k[i]);
for(int j=0;j<k[i];j++)
{
scanf("%d",&p[j]);
if(p[j]>max)
max=p[j];
}
for(int x=0;x<k[i]-1;x++)
{
for(int y=x+1;y<k[i];y++)
{
merge(p[x],p[y]);
}
}
}
memcpy(tep,f,sizeof(f));
qsort(tep,max+1,sizeof(int),greater);
for(int i=1;i<=max;i++)
{
sum++;
while(tep[i+1]==tep[i]&&i+1<=max)
i++;
}
printf("%d %d\n",max,sum);
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d %d",&x,&y);
if(getFriend(x)==getFriend(y))
printf("Y\n");
else
printf("N\n");
}
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
f[i]=i;
}
}
int getFriend(int v)
{
if(f[v]==v)
{
return v;
}
return f[v]=getFriend(f[v]);
}
void merge(int a, int b)
{
int t1=getFriend(a);
int t2=getFriend(b);
if(t1!=t2)
{
f[t2]=t1;
}
}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-04-12 12:51
    关注

    修改处见注释,供参考:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int p[10000], k, f[10002];  // k[10000], f[10001], tep[10001]; 修改
    void  init(int n);
    int   getFriend(int v);
    void  merge(int a, int b);
    //int greater(const void* a, const void* b) {
    //    int* pa, * pb;
    //    pa = (int*)a;
    //    pb = (int*)b;
    //    return *pa - *pb;
    //}
    int max = 0;
    int main()
    {
        int n, q, x, y;
        int sum = 0;
        init(10001); //修改
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%d", &k);
            for (int j = 0; j < k; j++)
            {
                scanf("%d", &p[j]);
                if (p[j] > max)
                    max = p[j];
            }
            //for (int x = 0; x < k[i] - 1; x++)
            //{
            for (int y = 1; y < k; y++)
            {
                merge(p[0], p[y]);
            }
            //}
        }
           //memcpy(tep, f, sizeof(f));
           //qsort(tep, max + 1, sizeof(int), greater);
        for (int i = 1; i <= max; i++)
        {
            if (f[i] == i) sum++;
            //while (tep[i + 1] == tep[i] && i + 1 <= max)
            //    i++;
        }
        printf("%d %d\n", max, sum);
        scanf("%d", &q);
        for (int i = 0; i < q; i++)
        {
            scanf("%d %d", &x, &y);
            if (getFriend(x) == getFriend(y))
                printf("Y\n");
            else
                printf("N\n");
        }
    }
    void init(int n)
    {
        for (int i = 1; i <= n; i++) //for (int i = 0; i <= n; i++)
        {                            //修改
            f[i] = i;
        }
    }
    int getFriend(int v)
    {
        if (f[v] == v)
        {
            return v;
        }
        else{
            f[v] = getFriend(f[v]); //修改
            return f[v];
        }
    }
    void merge(int a, int b)
    {
        int t1 = getFriend(a);
        int t2 = getFriend(b);
        if (t1 != t2)
        {
            f[t2] = t1;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月12日
  • 已采纳回答 4月12日
  • 修改了问题 4月12日
  • 修改了问题 4月12日
  • 展开全部

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址