• Educational Codeforces Round 22 C. The Tag Game


    题目链接:Educational Codeforces Round 22 C. The Tag Game

    题意:

    给你一棵树,Alice在顶点1,Bob在顶点x,每人轮流走一步,每次可以去相邻的节点。

    如果Alice走到Bob的位置,游戏结束。

    Bob想让游戏的轮数尽可能多,Alice想让游戏的轮数尽可能少。

    双方都采取最优策略。问游戏持续多久。

    题解:

    显然,Bob要向以1为根的树深度最深的节点走。

    不过有可能Bob在其他的子树上,所以dfs一下每个节点的最大深度,

    然后判断一下Bob能走到的最大深度就行了。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
     3 using namespace std;
     4 typedef long long ll;
     5 
     6 const int N=2e5+7;
     7 int n,m,x,y,mx[N],dep[N],ans,f[N];
     8 vector<int>g[N];
     9 
    10 void dfs(int x=1,int cnt=0,int fa=0)
    11 {
    12     dep[x]=cnt,mx[x]=cnt,f[x]=fa;
    13     for(auto &it:g[x])if(it!=fa)
    14         dfs(it,cnt+1,x),mx[x]=max(mx[x],mx[it]);
    15 }
    16 
    17 int main()
    18 {
    19     scanf("%d%d",&n,&m);
    20     F(i,1,n-1)
    21     {
    22         scanf("%d%d",&x,&y);
    23         g[x].push_back(y);
    24         g[y].push_back(x);
    25     }
    26     dfs(),ans=mx[m];
    27     int now=m;
    28     while(f[now]!=1)
    29     {
    30         if(dep[now]>dep[m]-dep[now])ans=mx[now];
    31         now=f[now];
    32     }
    33     printf("%d
    ",ans*2);
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    MySQL主从复制搭建
    CSS基本样式简单介绍
    前端代码编码规范
    Markdown语法简单介绍
    Java API 操作Redis
    Java API 操作Zookeeper
    MySQL优化
    ES 可视化工具
    消息队列MQ
    Docker基础
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7126624.html
Copyright © 2020-2023  润新知