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

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

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个数,表示lxhpfz的初始位置的编号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最短路不知道为什么错了,待定!!!

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

时间: 2024-12-08 23:09:17

UESTC 树上战争(Battle on the tree) Label:并查集?的相关文章

CDOJ 32 树上战争(Battle on the tree) 解题报告

啊啊,最后一篇了,已经零点多了,我还打算写一段第一次打工赚钱做家教的感想呢…… 接下来有时间做决赛题,感觉也不是很难吼? 题目链接:http://acm.uestc.edu.cn/#/problem/show/32 很简单的题目,比较一棵有根树两个节点哪个高度. 同样,用了一行广搜.不要问我为什么叫一行广搜,不要让我压代码压得不成样子,编程可是一种艺术…… 也许我应该规范一下比如const变量的命名? #include <cstdio> #include <cstring> usi

cdoj32-树上战争(Battle on the tree) 【记忆化搜索】

http://acm.uestc.edu.cn/#/problem/show/32 树上战争(Battle on the tree) Time Limit: 12000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜. In

hdoj 1325 Is It A Tree? 【并查集】

做了一上午,终于ac了 wa了一次主要是忘了还有环!!! 主要是运用并查集知识,又复习了一次!! 思路:输入之后找能不能成环,成环就不是,其次还要判断是不是有两个父节点,如果有两个父节点也不是,之后就找相关的祖先就好了: 还要注意:如果只有一个节点,也是树,如果有两个或多个根节点也不是树:如果没有根节点也不是 链接http://acm.hdu.edu.cn/showproblem.php?pid=1325 代码 #include<stdio.h> int fat[1000]; int fath

【HDU1325】Is It A Tree?(并查集基础题)

有以下坑点: 1.结束输入不一定-1,题目中的叙述只是说所有权值都为正值. 2.是否构成一棵树不能只判断是否只有一个根节点,没有环路,而且还需要判断每个节点的入度一定是1,不然就不是一棵树. (无环路也可用树的性质:结点数 = 边树 + 1 来取代) 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cctype> 5 #include <cmath&

Codeforces 915F Imbalance Value of a Tree(并查集)

题目链接  Imbalance Value of a Tree 题意  给定一棵树.求树上所有简单路径中的最大权值与最小权值的差值的和. 首先考虑求所有简单路径中的最大权值和. 对所有点按照权值大小升序排序,即若$a[i] < a[j]$,那么$i$排在$j$前面. 接下来开始依次处理.对于每个点$i$,寻找周围跟他连通并且权值比他小的点进行合并,并且累加答案. 整个过程用并查集维护. #include <bits/stdc++.h> using namespace std; #defi

POJ 1308 Is It A Tree? (并查集)

Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23006   Accepted: 7898 Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edge

cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 日复一日,年复一年,春去秋来. 卿学姐终于从天行廖那里毕业啦.出山的卿学姐首先来到了一个诡异的村庄. 在这个村庄中,只有两种人,一种是好人,一种是坏人. 好人只说真话,坏人只说假话. 村庄虚伪的平静由于卿学姐的到来,终于被打破了. 人们开始互相指控,每个人都会说另外一个人是否是好人.

POJ - 1308 Is It A Tree?【并查集】

A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the root, to which no d

Is It A Tree?——简单并查集应用

题目链接 题意: 判断所给的数据能否构成一颗树. 题解: 题目中所给的是有向树,并给出了性质:1.只有一个节点,称为根节点,没有定向边指向它.2.除了根节点外,每个节点都只有有一条指向它的边.3.从树根到任一结点有一条有向通路.抽象过来就是三个条件:1.只有一个入度为0的点,作为根节点.2.除根节点外,其他点的入度只能为1.3.所有点都能连通,也就是所有点需要在一个集合中,使用并查集来划分集合. 注意!!!可能会出现空树,也就是0 0,空树也是树. 代码: #include<iostream>