UVALive3027 并查集

简介: 题意:有n个节点,初始时每个节点的父节点都不存在,你的任务是执行一次I操作和E操作,格式如下:I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证之星指令前没有父节点E u:询问u到根节点的距离 题意显然是要用并查集 #include #include #in...

题意:有n个节点,初始时每个节点的父节点都不存在,你的任务是执行一次I操作和E操作,格式如下:
I u v:把节点u的父节点设为v,距离为|u-v|除以1000的余数。输入保证之星指令前没有父节点
E u:询问u到根节点的距离

题意显然是要用并查集

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 20000 + 10;
int p[MAXN];
int d[MAXN];
int findset(int x){
	if(p[x]!=x){
		int root = findset(p[x]);
		d[x] += d[p[x]];
		return p[x] = root;
	}
	else return x;
}
int main(){
//	freopen("in.txt", "r", stdin);
	int cas;
	scanf("%d", &cas);
	while(cas--){
		int n;
		scanf("%d", &n);
		int i;
		for(i=1; i<=n; i++){
			p[i] = i;
			d[i] = 0;		//!清除d数组原有数据,防止混乱
		}
		char op[5];
		while(scanf("%s", &op) && op[0]!='O'){
			int u, v;
			if(op[0] == 'I'){
				scanf("%d%d", &u, &v);
				p[u] = v;
				d[u] = abs(u-v)%1000;
			}
			if(op[0]=='E'){
				scanf("%d", &u);
				findset(u);
				printf("%d\n", d[u]);
			}
		}
	}
}



目录
相关文章
|
6月前
|
算法
并查集,路径压缩
并查集,路径压缩
42 0
|
6月前
并查集。。
并查集。。
34 0
并查集及其应用
并查集及其应用
62 0
|
6月前
|
算法 测试技术
并查集算法
并查集算法
|
6月前
|
机器学习/深度学习
并查集(UnionFind)总结
并查集(UnionFind)总结
63 0
|
算法
并查集模板题
并查集模板题
48 0
|
存储 算法 iOS开发
并查集详解及应用
并查集详解及应用
3851 0