HDU 2545 树上战争
2015-07-15 12:15
381 查看
树上战争
Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 668 Accepted Submission(s): 366
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总是先移动
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。
Source
UESTC 6th Programming Contest Online
分析:
看两个人所在层次,层次深的将会输。
代码:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int maxn = 1e5 + 5; int f[maxn]; int Find(int x) { int k = 0; while(x != f[x]) { k++; x = f[x]; } return k; } int main() { int n, m; while(~scanf("%d%d", &n, &m), n, m) { int x , y; for(int i = 1; i <= n; i++) f[i] = i; //初始化并查集 n--; while(n--) { scanf("%d%d", &x, &y); f[y] = x; } int c1, c2; while(m--) { scanf("%d%d", &x, &y); int t1 = Find(x); //得到层次 int t2 = Find(y); if(t1 <= t2) printf("lxh\n"); else printf("pfz\n"); } } return 0; }
相关文章推荐
- 内置在虚拟机上64位操作系统:该主机支持 Intel VT-x,但 Intel VT-x 残
- android之XListview,上拉下拉出现BUG
- 053第244题
- 我不是我自己,我怎么可能快乐
- java web在线预览pdf
- const_cast引发的常量折叠思考
- vim编辑器常用命令汇总
- AlertDialog
- 欢迎使用CSDN-markdown编辑器
- 文章标题
- Java调用Hadoop API
- Indy10 即时通讯Demo
- TECHNOLOGY: Oracle ADF Service, Please!
- 求帮看!!!!BZOJ 1014 [JSOI2008]火星人prefix
- js原生弹出框
- CCF 201503-3 节日
- 世界很残酷,交友须谨慎
- 用户登录提交前,密码加密传输
- WPF性能优化经验总结
- Django框架中方法的访问和查找