P1196 [NOI2002]银河英雄传说

喵喵喵这道题这题跟搭积木很像,然而我居然迷失在了这令人心醉神迷的题面之中。。(逃

好的呢这题就是一个比较绕的并查集,每次将一个的头接在要移到的地方的尾上,并每次访问的时候用将两个的后缀数相减即可得出答案

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#include<ctime>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<cstdio>
#include<sstream>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30005;

int n;
int f[N],s[N],b[N];

int find(int o){//并查集
    if(f[o]==o){
		return o;
	}
    int k=f[o];
    f[o]=find(f[o]);
    s[o]+=s[k];
    b[o]=b[f[o]];
    return f[o];
}

int main(){
	scanf("%d",&n);
    for(int i=1;i<=30000;i++){
		f[i]=i;
		s[i]=0;
		b[i]=1;
	}
    for(int i=1;i<=n;i++){
        char ch;
        int x,y,dx,dy;
        cin>>ch;
		scanf("%d%d",&x,&y);
        if(ch=='M'){//加边情况
            dx=find(x);
            dy=find(y);
            f[dx]=dy;
            s[dx]+=b[dy];
            b[dx]+=b[dy];
            b[dy]=b[dx];
        }
        if(ch=='C'){//访问情况
            dx=find(x);
            dy=find(y);
            if(dx!=dy){
            	printf("-1
");
				continue;
			}
			printf("%d
",abs(s[x]-s[y])-1);//输出
        }
    }
    return 0;
}

  好的就酱紫

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11150086.html