• Luogu 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
    ");//如果不在同一列,输出-1 
                    else printf("%d
    ",int(abs(p[y]-p[z])-1));//否则输出它们之间的战舰数目 
            }
        }
        return 0;
    }
  • 相关阅读:
    python3之面向对象实例存家具
    python3之面向对象实例烤地瓜
    python3之批量修改文件名称
    python3处理大文件
    利用函数的递归计算数字的阶乘
    windows10安装.netframework3.5
    centos7-django(python3)环境搭建
    centos7-django(python3)环境搭建!
    Java线程池
    python设置编码
  • 原文地址:https://www.cnblogs.com/wozaixuexi/p/8438076.html
Copyright © 2020-2023  润新知