http://acm.hdu.edu.cn/showproblem.php?pid=2545
Problem Description
给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜
Input
输入包含多组数据
每组第一行包含两个数N,M(N,M<=100000),N表示树的节点数,M表示询问数,N=M=0表示输入结束。节点的编号为1到N。
接下来N-1行,每行2个整数A,B(1<=A,B<=N),表示编号为A的节点是编号为B的节点的父亲
接下来M行,每行有2个数,表示lxh和pfz的初始位置的编号X,Y(1<=X,Y<=N,X!=Y),lxh总是先移动
每组第一行包含两个数N,M(N,M<=100000),N表示树的节点数,M表示询问数,N=M=0表示输入结束。节点的编号为1到N。
接下来N-1行,每行2个整数A,B(1<=A,B<=N),表示编号为A的节点是编号为B的节点的父亲
接下来M行,每行有2个数,表示lxh和pfz的初始位置的编号X,Y(1<=X,Y<=N,X!=Y),lxh总是先移动
Output
对于每次询问,输出一行,输出获胜者的名字
Sample Input
2 1 1 2 1 2 5 2 1 2 1 3 3 4 3 5 4 2 4 5 0 0
Sample Output
lxh pfz lxh 提示:本题输入、输出都很多,请使用scanf和printf代替cin、cout。
分析:
这题是并查集???? 也不能算吧,主要思路是建树之后,看到达根节点的步数少谁就赢了。。。
代码:
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 int parent[100010]; 5 int get(int x) 6 { 7 int num=0; 8 while(x!=parent[x]) 9 { 10 x=parent[x]; 11 num++; 12 } 13 return num; 14 } 15 int main() 16 { 17 int n,m; 18 while(~scanf("%d%d",&n,&m),n|m) 19 { 20 int a,b,i,x,y; 21 for(i=1;i<=n;i++) 22 parent[i]=i; 23 for(i=1;i<n;i++) 24 { 25 scanf("%d%d",&a,&b); 26 parent[b]=a; 27 } 28 while(m--) 29 { 30 scanf("%d%d",&x,&y); 31 int px=get(x); 32 int py=get(y); 33 if(px<=py) 34 puts("lxh"); 35 else 36 puts("pfz"); 37 } 38 } 39 return 0; 40 }