首页 > 代码库 > UESTC 树上战争(Battle on the tree) Label:并查集?

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

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

Input

输入包含多组数据

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

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

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

Output

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

Sample input and output

Sample InputSample Output
2 11 21 25 21 21 33 43 54 24 50 0
lxhpfzlxh

Source

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

代码

 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 int dis[100005],fa[100005];//dis到根节点距离  8 int n,m; 9 10 int Find(int x){11     if(dis[x]>0) return dis[x];12     13     if(x==fa[x]) return 0;14     else return dis[x]=Find(fa[x])+1;15 }16 void init_(){17     memset(dis,0,sizeof(dis));18     for(int i=1;i<=n;i++) fa[i]=i;19 }20 int main(){21 //    freopen("01.in","r",stdin);22     while(scanf("%d%d",&n,&m)==2&&n>0&&m>0){23         init_();24         for(int i=1;i<n;i++){25             int u,v;26             scanf("%d%d",&u,&v);27             fa[v]=u;28         }29         while(m--){30             int u,v;31             scanf("%d%d",&u,&v);32             33             if(Find(u)<=Find(v))puts("lxh");34             else puts("pfz");35         }36     }37     return 0;38 }

谁离根近谁胜利

 

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

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

技术分享

 

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