zoukankan      html  css  js  c++  java
  • LuoguP1196_银河英雄传说_KEY

    题目传送门

    带权并查集问题。

    用fr[x]数组记录x战舰前(不包括自己)有几艘战舰,beh[x]数组记录x战舰后(包括自己)有几艘战舰。

    并查集即可。

    code

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    using namespace std;
    int fa[30001],T,fr[30001],beh[30001];
    int getf(int x){//并查集
        if(x==fa[x])return x;
        int k=getf(fa[x]);
        fr[x]+=fr[fa[x]];
        fa[x]=k;
        return fa[x];
    }
    void unino(int x,int y){
        int fx=getf(x),fy=getf(y);
        fa[fx]=fy;
        fr[fx]=beh[fy];//这里之所以能这样做,是因为并查集时会自动更新。
        beh[fy]+=beh[fx];
    }
    int check(int x,int y){
        int fx=getf(x),fy=getf(y);
        if(fx==fy)return abs(fr[x]-fr[y])-1;
        else return -1;
    }
    int main(){
        scanf("%d",&T);
            for(int i=1;i<=30000;i++)fa[i]=i,beh[i]=1;
        while(T--){
            char c;cin>>c;
            int x,y;scanf("%d%d",&x,&y);
            if(c=='M')unino(x,y);
            else printf("%d
    ",check(x,y));
        }
    }
  • 相关阅读:
    数据库 mysql 语句
    document对象
    javascript
    css样式表及属性
    css格式布局
    html 标签
    html 标签
    第四章
    第三章
    第二章
  • 原文地址:https://www.cnblogs.com/Cptraser/p/7593446.html
Copyright © 2011-2022 走看看