关于银河英雄传说的解题报告

本文记录了解决一道涉及并查集的数据结构题目过程。作者通过使用父亲数组及距离数组来实现对数据的操作,并详细描述了从初次尝试遇到的问题到最后解决的心路历程。文章强调了代码完成后进行逐字检查的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    怎么说呢,这道题还是比较水的,连我这种蒟蒻都能写出来。但其中历尽艰辛,回想起来便老泪纵横。这道题思路很简单,建立一个父亲数组自然是不用多说的,除此之外建立一个数组表示一个数到队首的距离,另一个表示此数所在列的元素个数。我在第一次find函数写挂了,所以好好的学习了一下。后来我在本地运行十分顺畅,提交时却爆零,加上题目旁边有人在抱怨输入数据的格式,我就认为是某平台的问题,就此纠结了约半个小时。后来阅读代码时发现一行神奇的语句:for(int i=i;i<=n;i++),我还有什么可说呢?
    虽说这道题不难,但也提醒我每一次打完代码都要自己逐字阅读。也算是很有收获吧!        

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int father[30010];
int a[30010];
int b[30010];
int find(int x)
{
    if(father[x]==x)return x;
    int temp=find(father[x]);
    a[x]=a[x]+a[father[x]];
    return father[x]=temp;
}
int main()
{
    int n,x,y,d,e;
    char c;
    cin>>n;
    for(int i=1;i<=30000;i++)
    {
        father[i]=i;
        b[i]=1;
    }
    for(int i=1;i<=n;i++)
    {
        cin>>c>>d>>e;
        x=find(d);
        y=find(e);
        if(c=='M')
        {
            father[x]=y;
            a[x]=b[y];
            b[y]+=b[x]; 
        } 
        else if(c=='C')
        {
            if(x!=y)
            cout<<"-1"<<endl;
            else
            cout<<abs(a[d]-a[e])-1<<endl;
        }
    }
    return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值