做题记录整理并查集1 P1196 [NOI2002] 银河英雄传说(2022/9/16)

P1196. [NOI2002] 银河英雄传说

其实就是让并查集多维护一个参数而已

#include <iostream>
#include <cstdio>
#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int fa[500005],w[500005],t,num[500005];
int zhao(int x) {
	if(x==fa[x]) 
	return fa[x];
	int k=fa[x];
	fa[x]=zhao(fa[x]);
	w[x]+=w[k];
	num[x]=num[fa[x]];
	return fa[x];
}

int main() {
	cin>>t;
	for1(i,1,500005)
		fa[i]=i,num[i]=1;
	for1(i,1,t)
	{
		char c;
		int a,b;
		cin>>c>>a>>b;
		if(c=='M') {
			int ji1=zhao(a),r2=zhao(b);
			if(ji1==r2) 
			continue;
			else 
			{
				fa[ji1]=r2;
				w[ji1]=w[r2]+num[r2];
				num[r2]+=num[ji1];
				num[ji1]=num[r2];
			}
		} 
		else {
			int ji1=zhao(a),r2=zhao(b);
			if(ji1!=r2) 
				printf("-1\n");
			 else 
				printf("%d\n",abs(w[a]-w[b])-1);
		}
	}
	return 0;
}
posted @ 2022-09-16 19:21  yyx525jia  阅读(23)  评论(0)    收藏  举报