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\n");
				continue;
			}
			printf("%d\n",abs(s[x]-s[y])-1);//输出
        }
    }
    return 0;
}

  好的就酱紫

转载于:https://www.cnblogs.com/hahaha2124652975/p/11150086.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值