cdoj32-树上战争(Battle on the tree) 【记忆化搜索】
2015-06-28 13:37
501 查看
http://acm.uestc.edu.cn/#/problem/show/32
Submit Status
给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,
每组第一行包含两个数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个数,表示
题解:记忆化搜索。这道题目,其实是要你求出两人所在节点的深度(即到根的距离),做个比较即可。实现时,把儿子指向父亲作为有向边,因为是树,所以n-1个节点对应n-1条有向边。做个记忆化搜索即可。
代码:
树上战争(Battle on the tree)
Time Limit: 12000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status
给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,
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 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 |
代码:
#include <fstream> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N=100005; int n,m; int u ; int dis ; bool b ; int dfs(int i); int main() { //freopen("D:\\input.in","r",stdin); //freopen("D:\\output.out","w",stdout); int t1,t2; while(scanf("%d%d",&n,&m),n){ memset(dis,-1,sizeof(dis)); memset(b,0,sizeof(b)); for(int i=1;i<n;i++){ scanf("%d%d",&t1,&t2); u[t2]=t1;//由儿子指向父亲 b[t2]=1; } for(int i=0;i<m;i++){ scanf("%d%d",&t1,&t2); if(dis[t1]==-1) dfs(t1); if(dis[t2]==-1) dfs(t2); if(dis[t1]<=dis[t2]) puts("lxh"); else puts("pfz"); } } return 0; } int dfs(int i){ if(dis[i]!=-1) return dis[i]; if(b[i]==0) return 0; dis[i]=dfs(u[i])+1; return dis[i]; }
相关文章推荐
- 140.字符串链接(不使用strcat)
- 家庭常用5号/7号电池购买及使用攻略
- Linux Shell学习之基础篇(不适合学习,仅为本人笔记)
- void及void指针含义的深刻解析
- 一些项目——鞍点计算
- JVM 类加载过程
- Linux输入子系统模型
- 始终感觉作者没有找准点子,留着以后打作者的脸
- spring结合时,web.xml的配置
- auto_ptr、shared_ptr、weak_ptr、scoped_ptr用法小结
- 害怕的东西真的遇到了
- 狄马:荒谬的苦难哲学
- 链表的各种递归非递归遍历
- Var Function(_JX_)
- 高考完第一天
- Material Design控件使用(二)
- 处处可导 但导函数不连续的例子
- 开源运动的破坏性效应
- Material Design控件使用(一)
- Java Web应用程序:Oozie及其使用方式