cdoj 树上战争(Battle on the tree) Label:并查集?

给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜。

Input

输入包含多组数据

每组第一行包含两个数NN,MM(NN,M≤100000M≤100000),NN表示树的节点数,MM表示询问数,N=M=0N=M=0表示输入结束。节点的编号为11到NN。

接下来N−1N−1行,每行22个整数AA,BB(1≤A1≤A,B≤NB≤N),表示编号为AA的节点是编号为BB的节点的父亲。

接下来MM行,每行有22个数,表示lxh和pfz的初始位置的编号XX,YY(1≤X1≤X,Y≤NY≤N,X≠YX≠Y),lxh总是先移动。

Output

对于每次询问,输出一行,输出获胜者的名字。

Sample input and output

Sample Input

Sample Output

2 1

1 2

1 2

5 2

1 2

1 3

3 4

3 5

4 2

4 5

0 0

lxh

pfz

lxh

Source

电子科技大学第六届ACM程序设计大赛 初赛

代码

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int dis[],fa[];//dis到根节点距离
int n,m; int Find(int x){
if(dis[x]>) return dis[x]; if(x==fa[x]) return ;
else return dis[x]=Find(fa[x])+;
}
void init_(){
memset(dis,,sizeof(dis));
for(int i=;i<=n;i++) fa[i]=i;
}
int main(){
// freopen("01.in","r",stdin);
while(scanf("%d%d",&n,&m)==&&n>&&m>){
init_();
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
fa[v]=u;
}
while(m--){
int u,v;
scanf("%d%d",&u,&v); if(Find(u)<=Find(v))puts("lxh");
else puts("pfz");
}
}
return ;
}

谁离根近谁胜利

之前写了个dfs最短路不知道为什么错了,待定!!!

结论大概是初始化有问题,待改!!!

cdoj 树上战争(Battle on the tree) Label:并查集?

上一篇:linux下创建文件的文件权限问题


下一篇:TP验证