zoukankan      html  css  js  c++  java
  • [CF813C] The Tag Game(dfs)

    题目链接:http://codeforces.com/contest/813/problem/C

    题意:两个人在一棵树上走,A在树根,B在另一个点。A希望尽可能快地找到B,B希望尽可能慢地被找到。问这两个人走过的点的数量和。

    考虑两个人所在链的中点,从这个中点向下找最深的那个点就是B希望去的点,A也只能跟着走过去。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn = 200200;
     5 int n, x, ret;
     6 vector<int> G[maxn];
     7 int pre[maxn], depth[maxn];
     8 
     9 void init(int u, int p) {
    10     pre[u] = p; depth[u] = depth[p] + 1;
    11     for(int i = 0; i < G[u].size(); i++) {
    12         int v = G[u][i];
    13         if(v == p) continue;
    14         init(v, u);
    15     }
    16 }
    17 
    18 void dfs(int u, int p) {
    19     ret = max(ret, depth[u]);
    20     for(int i = 0; i < G[u].size(); i++) {
    21         int v = G[u][i];
    22         if(v == p) continue;
    23         dfs(v, u);
    24     }
    25 }
    26 
    27 int main() {
    28     // freopen("in", "r", stdin);
    29     int u, v;
    30     while(~scanf("%d%d",&n,&x)) {
    31         for(int i = 1; i <= n; i++) G[i].clear();
    32         memset(pre, 0, sizeof(pre));
    33         memset(depth, -1, sizeof(depth));
    34         ret = 0;
    35         for(int i = 1; i < n; i++) {
    36             scanf("%d%d",&u,&v);
    37             G[u].push_back(v);
    38             G[v].push_back(u);
    39         }
    40         init(1, 0);
    41         int a = 1;
    42         while(a < depth[pre[x]]) {
    43             a++;
    44             x = pre[x];
    45         }
    46         dfs(x, pre[x]);
    47         printf("%d
    ", 2*ret);
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    Docker宿主机登陆Container方法
    Get Docker for CentOS and Installing Docker
    CentOS7网络配置
    国内npm镜像源推荐及使用
    CentOS6.5源码安装python3.5.2
    阿里云SLB后Nginx、Tomcat获取真实IP
    MacOS清除管理员密码
    SVN-修改已提交的日志
    爬虫的初始和requests模块基础用法
    利用面向对象写的登录与注册
  • 原文地址:https://www.cnblogs.com/kirai/p/6956492.html
Copyright © 2011-2022 走看看