cf813C(bfs)
题目链接: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)相关推荐
- HDU-1459.非常可乐(BFS )
这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过... 本题大意:给出可乐的体积v1,给出两 ...
- HDU1548:A strange lift(Dijkstra或BFS)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
- usaco Overfencing 穿越栅栏(BFS)
Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...
- 数据结构--搜索BFS
文章目录 广度优先搜索 典型例题 广度优先搜索 广度优先搜索类似于树的层次遍历过程.它需要借助一个队列来实现.如图2-1-1所示,要想遍历从v0到v6的每一个顶点,我们可以设v0为第一层,v1.v2. ...
- 2017icpc沈阳 G Infinite Fraction Path BFS+剪枝
题意:给一个长度为n的字符串数组,你可以选定起点跳n次,从i点只能跳到(i*i+1)%n的位置,最后求一个最大字典序. 思路:要求最大的,即每一步都是最大,所以将最大的数都入队进行bfs跳下一步. 剪 ...
- HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路
题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- hiho_1139_二分+bfs搜索
题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值. 题目链接:二分 最小化最大值,考虑采用二分搜索.对所有的边 ...
最新文章
- c语言增强,C语言提高-day5
- Java -jar启动服务与Tomcat服务器上部署JAR之间的区别
- dos2unix批量转换的脚本
- DayDayUp:互联网江湖大佬那些事(互联网大佬学历一览)
- Android恶意软件偷取Uber凭证
- CRM_ORGMAN_CHECK_OW
- linux oracle手动启动两个实例
- C++实现AOE网中的关键路径算法(邻接表存储)
- P4015 运输问题
- python知识点总结_20211231
- Flutter时间轴(timeline)
- rpcbind.service启动失败
- Android Content Providers(二)——Contacts Provider
- matlab随机信号实验报告,随机信号分析实验报告(基于MATLAB语言)
- Face Recognition 库-人脸识别
- 为什么程序员很难找到合适的另一半?
- 什么是大型机和小型机
- 心灵捕手影评,觉得很好。看一部好电影就像读一本好书。
- 纵横三国外挂手记(1) 分析篇
- 从《我不是潘金莲》谈程序员的核心竞争力 1
热门文章
- 大道至简:算法工程师须知的十个炼丹trick
- PyTorch扩展自定义PyThon/C++(CUDA)算子的若干方法总结
- C++编程积累——C++实现十进制与二进制之间的互相转换
- 推荐系统遇上深度学习(五)--DeepCross Network模型理论和实践
- ipqc异常处理流程图_IPQC巡检流程.七大手法.八大原则.九大步骤
- python os popen_Python os.popen() 方法
- android命令打包,android 命令打包
- 猜拳游戏php代码,最常见的猜拳小游戏Android代码实现
- Mac 使用Eigen库
- Oracle 存储过程调用语句