做题记录:P1196 [NOI2002]银河英雄传说

Posted wozaixuexi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了做题记录:P1196 [NOI2002]银河英雄传说相关的知识,希望对你有一定的参考价值。

P1196 [NOI2002]银河英雄传说

//P1196 [NOI2002]银河英雄传说
#include<iostream>
#include<cstdio>
#include<cmath>
    using namespace std;
    int f[30005],p[30005],s[30005];
    //f[i]表示第i艘战舰与哪一艘战舰在同一列中
    //p[i]表示第i艘战舰的前面有多少艘战舰
    //s[i]表示第i列有多少艘战舰 
void find_x(int x)//起到路径压缩的作用 
{
    if(f[x]==x) return;//如果找到了祖先,就结束 
    find_x(f[x]);//如果没有,就继续找 
    p[x]+=p[f[x]];//更新p[x]的值
    f[x]=f[f[x]];//路径压缩 
}
int main()
{
    for(int i=1;i<=30000;i++)//初始化 
    {
        f[i]=i;
        s[i]=1;
        p[i]=0;
        
    }
    int T=0;
    scanf("%d",&T);
    for(int q=1;q<=T;q++)
    {
        char x= ;
        int y=0,z=0;
        scanf(" %c%d%d",&x,&y,&z);
        if(x==M)//合并操作 
        {
            find_x(y);
            find_x(z);
            int tx=f[y],ty=f[z];
            f[tx]=ty;//合并 
            p[tx]=s[ty];//合并到另一列的那个队列的队首战舰前面的战舰数就是另一列的总战舰数 
            s[ty]+=s[tx];//更新这一列的战舰数 
            s[tx]=0;//更新这一列的战舰数 
        }
        else//询问 
        {
            find_x(y);
            find_x(z);
            int tx=f[y],ty=f[z];
            if(tx!=ty) printf("-1\n");//如果不在同一列,输出-1 
                else printf("%d\n",int(abs(p[y]-p[z])-1));//否则输出它们之间的战舰数目 
        }
    }
    return 0;
}

 

以上是关于做题记录:P1196 [NOI2002]银河英雄传说的主要内容,如果未能解决你的问题,请参考以下文章

P1196 [NOI2002] 银河英雄传说(并查集)

P1196 [NOI2002]银河英雄传说

P1196 [NOI2002]银河英雄传说

NOI2002 银河英雄传说(luogu p1196)

洛谷P1196[NOI2002]银河英雄传说-并查集扩展

题解 P1196 [NOI2002] 银河英雄传说