【无标题】

文章介绍了如何使用递归和并查集数据结构解决亲戚和朋友关系问题,通过数组存储辈分或朋友关系,并在进阶版本中处理两个公司的负数表示。
摘要由CSDN通过智能技术生成

亲戚 - 洛谷

这道题和并查集类似,这里我理解为第一个人的辈分小于第二个人,最后是亲戚的就会指向辈分最大的人,用递归来转辈分,用数组来存辈分。

代码如下:

#include<stdio.h>
int a[10000];
int ld(int k)
{
    if(a[k]==k) return k;
    return a[k]=ld(a[k]);
}
int main()
{
    int q,w,e;
    scanf("%d%d%d",&q,&w,&e);
    for(int i=1;i<=q;i++)
        a[i]=i;
    for(int i=0;i<w;i++){
        int n,m;
    scanf("%d%d",&n,&m);
    a[ld(n)]=ld(m);
    }
    for(int i=0;i<e;i++){
            int t,y;
    scanf("%d%d",&t,&y);
        if(ld(t)==ld(y))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

进阶版:

朋友 - 洛谷

思路:和刚才那个题一样将朋友用数组存起,是朋友的都指向最初的朋友;

然后判断和第一个朋友的朋友有多少个,最后输出小的那个+1(小明和小红也是一对);

注意:这里有两个公司所以要用两个数组,而且有个公司用负数表示,所以这里要再加一个负号变为正数。

代码如下:

#include<stdio.h>
int a[100000],b[100000];
int py(int k,int m[])
{
    if(m[k]==k) return k;
    return m[k]=py(m[k],m);
}
int main()
{
    int q,w,e,r;
    scanf("%d%d%d%d",&q,&w,&e,&r);
    for(int i=1;i<=q;i++)
        a[i]=i;
    for(int i=1;i<=w;i++)
        b[i]=i;
    for(int i=0;i<e;i++){
        int n,m;
        scanf("%d%d",&n,&m);
        a[py(n,a)]=py(m,a);
    }
    for(int i=0;i<r;i++){
        int t,y;
        scanf("%d%d",&t,&y);
        b[py(-t,b)]=py(-y,b);
    }
    int man=0,woman=0;
    for(int i=2;i<=q;i++){
        if(a[py(1,a)]==py(i,a))
            man++;
    }
    for(int i=2;i<=w;i++){
        if(b[py(1,b)]==py(i,b))
            woman++;
    }
    if(man<woman)
        woman=man;
    printf("%d",woman+1);
    return 0;
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值