时间:2016-03-19 13:24:23 星期六
题目编号:[2016-03-19][UVALive][3027][Corporative Network]
题目大意:给定n个节点,I u v表示把u节点的父节点设置为v,距离为|u-v|%1000,E u表示询问u到根节点的距离,给定若干个I E操作,输出相应答案
分析:带权并查集
方法:d[maxn] 维护到父节点的距离,每次询问的时候,把当前节点压缩到根节点输出对应距离即可
#ifdef _WORK_#include <algorithm>#include <cstdio>#include<cstring>using namespace std;#define CLR(x,y) memset((x),(y),sizeof((x)))#define FOR(x,y,z) for(int (x)=(y);(x)<(z);++(x))const int maxn = 20000 +10;int fa[maxn],d[maxn];inline void ini(int n){ CLR(d,0); FOR(i,0,n+1) fa[i] = i;}int fnd(int x){ if(x == fa[x]) return x; int tmp = fa[x]; fa[x] = fnd(fa[x]); d[x] = d[x] + d[tmp]; return fa[x];}int main(){ int t,n,p,q; char str[10]; scanf("%d",&t); while(t--){ scanf("%d",&n); ini(n); while(~scanf("%s",str) && str[0] != 'O'){ if(str[0] == 'I'){ scanf("%d%d",&p,&q); fa[p] = q; d[p] = abs(p - q)%1000; }else{ scanf("%d",&p); fnd(p); printf("%d\n",d[p]); } } } return 0;}