銀河英雄傳說 並查集+ 邊帶權

LINK

#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int fa[N],d[N],size[N];//size表示以x爲樹根的集合大小 
int  find(int x) 
{
	if(fa[x]==x) return x;
	int tt=find(fa[x]);
	d[x]+=d[fa[x]];
	// d[x]表示x到樹根的路徑邊權和 
	// d[x]+=d[fa[x]] 子節點加上父節點到根節點的距離 
	return fa[x]=tt;//把父節點重置爲根節點 
}
void unite(int x,int y)
{
	int tx=find(x),ty=find(y);
	fa[tx]=ty;
	d[tx]=size[ty];// size[x]表示以x爲樹根的集合大小
	size[ty]+=size[tx];//集合元素增加
}
int main()
{
	int n;scanf("%d ",&n);
	for(int i=1;i<=30000;i++)
	{
		fa[i]=i;size[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		char c[2];scanf("%s",c);int x,y;scanf("%d%d",&x,&y);
		if(c[0]=='M')
		{
			unite(x,y);
		}else 
		{
			int xx=find(x);
			int yy=find(y);
			//判斷在不在一條鏈子上 
			if(xx!=yy)
			{
				printf("-1\n");
			}else 
			{
				printf("%d\n",max(d[x],d[y])-min(d[x],d[y])-1);
			}
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章