您的位置:首页 > 其它

hdu 2545 树上战争(加权并查集)

2014-11-13 17:10 411 查看
题意:给出一颗树,每次询问树上两个节点到根的距离谁更近。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
using namespace std;

#define REP(i,s,t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i,s,t) for(int (i)=(s);(i)>=(t);--(i))
#define INF 0x7FFFFFFF

const int maxn = 100000+5;
int d[maxn], pa[maxn];
int n, m;

int Find(int x) {
if (x == pa[x]) return x;
int t = pa[x];
pa[x] = Find(pa[x]);
d[x] += d[t];
return pa[x];
}

int main() {
//freopen("input.in", "r", stdin);
while (scanf("%d%d",&n, &m) && (n|m)) {
int a, b;
memset(d, 0, sizeof(d));
for (int i=1;i<=n;++i) pa[i] = i;
for (int i=0;i<n-1;++i) {
scanf("%d%d",&a, &b);
pa[b] = a;
d[b] = 1;
}
for (int i=1;i<=n;++i) Find(i);
//for (int i=1;i<=n;++i) printf("%d ", d[i]);putchar('\n');
for (int i=0;i<m;++i) {
scanf("%d%d",&a, &b);
if (d[a]-1 < d[b])
printf("lxh\n");
else
printf("pfz\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: