zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    mysql忘记root密码解决办法
    laravel 获取所有表名
    跳转/传值(从页面到php文件)
    smarty foreach
    radio单选框
    dedecms实例化对象
    file_get_contents()
    if($a)
    bug解决思路
    git查看远程仓库地址
  • 原文地址:https://www.cnblogs.com/wozaixuexi/p/8438076.html
Copyright © 2011-2022 走看看