UESTC 树上战争(Battle on the tree) Label:并查集?
Posted Radiumlrb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UESTC 树上战争(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程序设计大赛 初赛
代码
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:并查集?的主要内容,如果未能解决你的问题,请参考以下文章
uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)