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]; 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) { 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; }
|