【并查集】LA3027 合作网络(记录离根结点距离)

题目

LA3027

思路

刘汝佳蓝书,并查集第二道例题

代码

#include 
#include 
#include 
#include 
#include 
#define _for(i,a,b) for(int i = a; i
#define _rep(i,a,b) for(int i = a; i<=b; i++)
using namespace std;

const int maxn = 20000+100;
int n, fa[maxn], d[maxn];

int findfa(int x){
	if (fa[x] == x) return x;
	int root = findfa(fa[x]);
	d[x] += d[fa[x]];
	fa[x] = root;
	return root;
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		getchar();
		_rep(i,1,n) fa[i] = i;
		memset(d,0,sizeof(d));
		char ch;
		while(scanf("%c",&ch) == 1 && ch != 'O'){
			if (ch == 'I'){
				int u,v;
				scanf("%d%d",&u,&v);
				getchar();
				fa[u] = v;
				d[u] = abs(u-v)%1000;
			} else {
				int u;
				scanf("%d",&u);
				getchar();
				findfa(u);
				printf("%d\n",d[u]); 
			}
		}
	}
	
	return 0;
}

你可能感兴趣的:(9.noip及时复习,数据结构,并查集,图论)