The Tag Game

The Tag Game

题解

A代表的是Alice的初始位置,一开始有想BFS,但是如果是B到与A的交叉点的距离比A到与B的交叉点的距离大的时候,那A与B不就不能到达最左边的最远距离,那该怎么解决呢?(本来就不太会BFS,DFS)

我们可以计算两个人到这个数上面的某一个点的距离,如果说Bob到某一个顶点的距离比Alice到某一个点的距离要大的话,这个点不成立,(Bob要尽量把这个时间最大化)!直接比较的是到某一个节点的时候Alice到这个节点的步数是大于Bob到这一点的步数。

注意:就算Bob到最远的角落里,这一点还是要加上的,那么我们只需求Alice到达最远处的距离就行了,然后乘以2.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=2e5+5;
vector<int>mpp[maxn];
int dis1[maxn],dis2[maxn];//分别代表Alice, Bob距离各自初始点的距离
int vis[maxn];//判断是否走过某一点,标记点
int n,x;
void bfs(int beginn,int *num)
{
queue<int>q;
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));//标记是否走过
num[beginn]=0;//距离
vis[beginn]=1;//标记
q.push(beginn);
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<mpp[t].size();i++)
{
int l=mpp[t][i];
if(vis[l]) continue;
vis[l]=1;
num[l]=num[t]+1;
q.push(l);
}
}
}
int main()
{
while(cin>>n>>x)//n-1组数据,Bob初始点
{
int a,b;
for(int i=0;i<maxn;++i)
mpp[i].clear();
for(int i=1;i<n;++i)
{
cin>>a>>b;
mpp[a].push_back(b);
mpp[b].push_back(a);
}
bfs(1,dis1);
bfs(x,dis2);
int sum=0;
for(int i=1;i<=n;++i)
{
if(dis1[i]>dis2[i])
sum=max(sum,dis1[i]);
}
cout<<sum*2<<endl;
}
return 0;
}