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

题意:给出一颗树,开始时两个人 Alice 和 Bob 分别站在 1(树根)和 x 处.此后每一次操作两人都可以选择在原地不动或者移动到相邻的节点(Bob先移动);

直至两人移到同一个位置,两人移动的总步数为 ans,Alice要使 ans 尽量小,Bob 要使 ans 尽量大,输出ans;

思路:假设最终在 p 位置相遇,显然 p 是由先移动的 Bob 决定的,即 p 能使 ans 最大;

用 dis1[p] 表示 1 到 p 的距离,dis2[p] 表示 x 到 p 的距离,要满足 Alice 和 Bob 在移动到 p 之前不相遇,所以有 dis1[p] > dis2[p],那么显然有 ans = 2 * dis1[p];

即:先 bfs 出 1 和 x 到其他节点的最短距离,再遍历所有节点,对于节点 i,若满足 dis1[i] > dis2[i] ,则 ans = max(ans, 2 * dis1[i]),最终输出 ans 即可;

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <vector>
 4 #include <queue>
 5 #include <string.h>
 6 using namespace std;
 7
 8 const int MAXN = 2e5 + 10;
 9 vector<int> mp[MAXN];
10 bool vis[MAXN];
11
12
13 void bfs(int dis[MAXN], int p){//求以 p 为根时其余个点到 p 的距离
14     memset(vis, 0, sizeof(vis));
15     int ans = 0, cnt1 = 1, cnt2 = 0;
16     queue<int> q;
17     q.push(p);
18     vis[p] = true;
19     while(!q.empty()){
20         while(cnt1--){
21             int cnt = q.front();
22             q.pop();
23             for(int i = 0; i < mp[cnt].size(); i++){
24                 int cc = mp[cnt][i];
25                 if(!vis[cc]){
26                     q.push(mp[cnt][i]);
27                     vis[mp[cnt][i]] = true;
28                     cnt2++;
29                 }
30             }
31             dis[cnt] = ans;
32         }
33         cnt1 = cnt2;
34         cnt2 = 0;
35         ans++;
36     }
37 }
38
39 int main(void){
40     int n, x;
41     scanf("%d%d", &n, &x);
42     for(int i = 0; i < n - 1; i++){
43         int s, e;
44         scanf("%d%d", &s, &e);
45         mp[s].push_back(e);
46         mp[e].push_back(s);
47     }
48     int dis1[MAXN], dis2[MAXN];
49     bfs(dis1, 1);
50     bfs(dis2, x);
51     int ans = 0;
52     for(int i = 1; i <= n; i++){
53         if(dis1[i] > dis2[i] && mp[i].size() == 1){
54             ans = max(ans, dis1[i]*2);
55         }
56     }
57     cout << ans << endl;
58     return 0;
59 }

View Code

转载于:https://www.cnblogs.com/geloutingyu/p/6951975.html

cf813C(bfs)相关推荐

  1. HDU-1459.非常可乐(BFS )

    这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...

  2. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  3. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  4. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  5. 数据结构--搜索BFS

    文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...

  6. 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝

    题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...

  7. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

  8. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  9. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

最新文章

  1. c语言增强,C语言提高-day5
  2. Java -jar启动服务与Tomcat服务器上部署JAR之间的区别
  3. dos2unix批量转换的脚本
  4. DayDayUp:互联网江湖大佬那些事(互联网大佬学历一览)
  5. Android恶意软件偷取Uber凭证
  6. CRM_ORGMAN_CHECK_OW
  7. linux oracle手动启动两个实例
  8. C++实现AOE网中的关键路径算法(邻接表存储)
  9. P4015 运输问题
  10. python知识点总结_20211231
  11. Flutter时间轴(timeline)
  12. rpcbind.service启动失败
  13. Android Content Providers(二)——Contacts Provider
  14. matlab随机信号实验报告,随机信号分析实验报告(基于MATLAB语言)
  15. Face Recognition 库-人脸识别
  16. 为什么程序员很难找到合适的另一半?
  17. 什么是大型机和小型机
  18. 心灵捕手影评,觉得很好。看一部好电影就像读一本好书。
  19. 纵横三国外挂手记(1) 分析篇
  20. 从《我不是潘金莲》谈程序员的核心竞争力 1

热门文章

  1. 大道至简:算法工程师须知的十个炼丹trick
  2. PyTorch扩展自定义PyThon/C++(CUDA)算子的若干方法总结
  3. C++编程积累——C++实现十进制与二进制之间的互相转换
  4. 推荐系统遇上深度学习(五)--DeepCross Network模型理论和实践
  5. ipqc异常处理流程图_IPQC巡检流程.七大手法.八大原则.九大步骤
  6. python os popen_Python os.popen() 方法
  7. android命令打包,android 命令打包
  8. 猜拳游戏php代码,最常见的猜拳小游戏Android代码实现
  9. Mac 使用Eigen库
  10. Oracle 存储过程调用语句