codeforces 813C The Tag Game 树+dfs追击问题
C. The Tag Game
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Alice got tired of playing the tag game by the usual rules so she offered Bob a little modification to it. Now the game should be played on an undirected rooted tree of n vertices. Vertex 1 is the root of the tree.
Alice starts at vertex 1 and Bob starts at vertex x (x ≠ 1). The moves are made in turns, Bob goes first. In one move one can either stay at the current vertex or travel to the neighbouring one.
The game ends when Alice goes to the same vertex where Bob is standing. Alice wants to minimize the total number of moves and Bob wants to maximize it.
You should write a program which will determine how many moves will the game last.
Input
The first line contains two integer numbers n and x (2 ≤ n ≤ 2·105, 2 ≤ x ≤ n).
Each of the next n - 1 lines contains two integer numbers a and b (1 ≤ a, b ≤ n) — edges of the tree. It is guaranteed that the edges form a valid tree.
Output
Print the total number of moves Alice and Bob will make.
Examples
input
4 3
1 2
2 3
2 4
output
4
input
5 2
1 2
2 3
3 4
2 5
output
6
Note
In the first example the tree looks like this:
The red vertex is Alice's starting position, the blue one is Bob's. Bob will make the game run the longest by standing at the vertex 3 during all the game. So here are the moves:
B: stay at vertex 3
A: go to vertex 2
B: stay at vertex 3
A: go to vertex 3
In the second example the tree looks like this:
The moves in the optimal strategy are:
B: go to vertex 3
A: go to vertex 2
B: go to vertex 4
A: go to vertex 3
B: stay at vertex 4
A: go to vertex 4
题意:一颗无向有根树,A在根节点1,B在非根节点x。B先走然后再A走(如此下去),每一步要么向相连点移动要么不动。A要以尽可能减少移动步数的走法,B以尽可能增加步数的走法。当A与B相遇时游戏结束。求最大的移动步数。
分析:B肯定在A的子树里 所以A走法就是不走多余的节点直接去接近B,而B可以找到他能走到的离根节点1距离最大的点这样就能使最后步数最大。
所以求出刚开始A·B的路径上的节点,找到此路径上深度最大的节点且B能走到的节点Y,ans =( 1到Y+Y的能到的最深深度)*2.
暂时没有想到更简单的想法和代码的写法,直接贴上代码:
- #include <iostream>
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<vector>
- #define siz 201015
- using namespace std;
- int n,x,cot;
- int d[siz],path[siz],vis[siz],dep[siz];
- vector<int>G[siz];
- int dfs(int u,int fa)//求深度
- {
- int len = G[u].size(),Max = 0;
- for(int i=0; i<len; i++)
- {
- int v = G[u][i];
- if(v == fa) continue;
- dep[v] = dep[u] + 1;
- Max = max(dfs(v,u),Max);
- }
- return d[u] = Max+1;
- }
- void pdfs(int u,int fa,int t)//求出路径
- {
- if(cot) return;
- path[t] = u;
- if(u == x)
- {
- cot = t;
- return;
- }
- int len = G[u].size();
- for(int i=0; i<len; i++)
- {
- int v = G[u][i];
- if(v == fa) continue;
- pdfs(v,u,t+1);
- }
- }
- void solve()
- {
- int ans = 0;
- memset(d,0,sizeof(d));
- memset(vis,0,sizeof(vis));
- cot = 0,dep[1] = 0;
- dfs(1,-1);
- pdfs(1,-1,1);
- for(int i=cot,j=1; i; i--,j++)//B先走 然后再A走,vis[i] 表示A所在的位置。
- {
- vis[j] = 1;
- if(!vis[i]) ans = max(ans,d[path[i]]+dep[path[i]]-1);
- }
- cout<<ans*2<<endl;
- }
- int main()
- {
- int u,v;
- while(~scanf("%d %d",&n,&x))
- {
- for(int i=1; i<=n; i++) G[i].clear();
- for(int i=1; i<n; i++)
- {
- scanf("%d %d",&u,&v);
- G[u].push_back(v);
- G[v].push_back(u);
- }
- solve();
- }
- return 0;
- }
codeforces 813C The Tag Game 树+dfs追击问题的更多相关文章
- CodeForces - 813C The Tag Game (树的dfs遍历)
[传送门]http://codeforces.com/problemset/problem/813/C [题目大意]两个人玩游戏,一个人跑一个人追,轮流决策,可以走也可以不走.给你一棵树,想要从某个结 ...
- codeforces div2_603 F. Economic Difficulties(树dfs预处理+dp)
题目连接:http://codeforces.com/contest/1263/problem/F 题意:有n个设备,上和下分别连接着一颗树,上下两棵树每棵树的叶子节点连接一个设备,两棵树的根节点都是 ...
- CodeForces 384E Propagating tree (线段树+dfs)
题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 - ...
- CodeForces - 813C The Tag Game(拉格朗日乘数法,限制条件求最值)
[传送门]http://codeforces.com/problemset/problem/813/C [题意]给定整数a,b,c,s,求使得 xa yb zc值最大的实数 x,y,z , 其中x ...
- Codeforces 813C The Tag Game (BFS最短路)
<题目链接> 题目大意:A.B两人在一颗树上,A在根节点1上,B在节点x上,现在他们轮流走,每次只能走一步,或者不走.A以尽可能靠近B的方式行走,B以尽可能远离A的方式走,B先开始走.问你 ...
- HDU 5692 线段树+dfs序
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序
题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s 内存限制:512.0MB 总提交次数:196 AC次数:65 平均分: ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
随机推荐
- 1.新手上路:Windows下,配置Qt环境
个人体会: 我最初只是想看看C++除了"黑窗口"之外,怎么才能做一些"更好看的东西".之后在网上看到有人推荐Qt,就看了一下官网(https://www.qt. ...
- 制作一个塔防游戏 Cocos2d-x 2.1.4 (一)
在这篇文章,将会学习到怎样制作一个塔防游戏.在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进.怎样在地图上指定的位置创建炮塔.怎样使炮塔射击敌人,怎样可视化调试路点和炮塔 ...
- 02-线性结构3 Reversing Linked List(25 point(s)) 【链表】
02-线性结构3 Reversing Linked List(25 point(s)) Given a constant K and a singly linked list L, you are s ...
- GIN+GORILLA=A GOLANG WEBSOCKET SERVER
鉴于聊天已然成为大部分app的基础功能,而大部分app用户基数有没有辣么大,常用的聊天server架构如xmpp或者消息队列实现之类的用起来还挺麻烦的,有比较难跟网页端做交互,加之H5标准落地,所以w ...
- wait()和notify()
从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉 使用notify 和 wait的时候 要注意 是在sy ...
- PL/SQL DEVELOPER执行计划的查看
这里,我学到的一个很重要的东西,就是用PL/SQL DEVELOPER去看一条SELECT语句的执行计划,执行计划里面可以看到这条SELECT语句的开销.I/O操作开销等数值,可以很清晰地看到语句各个 ...
- codeforces 702C C. Cellular Network(水题)
题目链接: C. Cellular Network time limit per test 3 seconds memory limit per test 256 megabytes input st ...
- codevs 4768跳石头
传送门 4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在 ...
- C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解
模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程.对于函数模板而言,模板实例化之后,会生成一个真正的函数.而类模板经过实例化之后,只是完成了类的定义,模板类的成员函数需要到调用时才会被初始 ...
- bzoj1799同类分布——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: ...