poj1962 Corporative Network

题意:

1
4
E 3
I 3 1
E 3
I 1 2
E 3
I 2 4
E 3
O
意为一共1个样例,第一个样例有4个点,编号1,2,3,4

E 3的意思是求3到根结点的距离,显然为0

I 3 1的意思是将3(一定是根节点)所在并查集加入到1所在并查集中,3节点到1点的距离为(3-1)%1000


解法:

并查集

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
class T
{
public:
	int parent[20010];//父亲节点
	int len[20010];//到其父节点的距离
	void init(int n)
	{
		for(int i=1;i<=n;i++)
		{
			parent[i]=i;
		}
	}
	int root(int x)
	{
		if(parent[x]==x)
		{
			len[x]=0;
			return x;
		}
		int rx=root(parent[x]);
		len[x]+=len[parent[x]];
		parent[x]=rx;
		return rx;
	}
	void Merge(int a,int b)//a是根节点,连接到b所在的集合里
	{ 
		int rb=root(b);
		parent[a]=rb;
		len[a]=len[b]+abs(a-b)%1000;
	}
}disjoinset;//我的并查集
int main()
{
	int total;
	scanf("%d",&total);
	while(total--)
	{
		int n;
		scanf("%d",&n);
		disjoinset.init(n);
		char type;
		while(cin>>type,type!='O')
		{
			if(type=='E')
			{
				int t;
				scanf("%d",&t);
				disjoinset.root(t);
				printf("%d\n",disjoinset.len[t]);
			}
			else
			{
				int a,b;
				scanf("%d%d",&a,&b);
				disjoinset.Merge(a,b);
			}
		}
	}
	return 0;
}


你可能感兴趣的:(并查集)