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));
    }
}
原文地址:https://www.cnblogs.com/Cptraser/p/7593446.html