ural 2034. Caravans
2015-08-27 20:02
330 查看
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2034
题意描述:一个劫镖游戏共有N个城镇,M条长度为1双向边,保证连通;镖车从s点押镖到f点,有一波山贼居住在r点,早已获悉镖车路径的他们准备当镖车行进到某点时,从r点疾行,闪现劫镖;限制如下:谨慎镖车仅走最短路,傲娇山贼仅会攻击镖车路线节点中离r点最近的点;问题是求出在众多最短路当中,山贼们可能需要到达点的最大距离;
思路大致是两遍BFS,首先找出所有点到d点的最短距离,然后找出所有点到f点的最短距离;从s点出发,顺着到f点距离递减的各个方向,更新各条路线到d的动态最短距离,和各点所属路径中当前与d的最大距离;终点f处出最终结果;
AC代码:
题意描述:一个劫镖游戏共有N个城镇,M条长度为1双向边,保证连通;镖车从s点押镖到f点,有一波山贼居住在r点,早已获悉镖车路径的他们准备当镖车行进到某点时,从r点疾行,闪现劫镖;限制如下:谨慎镖车仅走最短路,傲娇山贼仅会攻击镖车路线节点中离r点最近的点;问题是求出在众多最短路当中,山贼们可能需要到达点的最大距离;
思路大致是两遍BFS,首先找出所有点到d点的最短距离,然后找出所有点到f点的最短距离;从s点出发,顺着到f点距离递减的各个方向,更新各条路线到d的动态最短距离,和各点所属路径中当前与d的最大距离;终点f处出最终结果;
AC代码:
//#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) struct Node{ int dlen, flen, line; // 依次为:到贼窝d的距离、到终点f的距离、所有经过该点路径中到贼窝距离的最大值 bool visit; Node() :dlen(-1), flen(-1), line(-1), visit(false){} }; const int maxn = 1e5 + 10; vector<int>table[maxn]; // 记录邻接信息 vector<Node>v(maxn); int s, f, d, n, m; void BFS(){ queue<int>q; v[d].dlen = 0; q.push(d); while (!q.empty()){ // 求出所有点到贼窝d的距离 int src = q.front(); q.pop(); for (int tar : table[src]) if (v[tar].dlen == -1){ v[tar].dlen = v[src].dlen + 1; q.push(tar); } } v[f].flen = 0; q.push(f); while (!q.empty()){ //求出所有点到终点f的距离 int src = q.front(); q.pop(); for (int tar : table[src]) if (v[tar].flen == -1){ v[tar].flen = v[src].flen + 1; q.push(tar); } } v[s].line = v[s].dlen; q.push(s); while (!q.empty()){ //从起点处,按照各个到终点距离递减的方向,更新路径最短距离line,以及经过各店路径最短距离的最大值 int src = q.front(); q.pop(); v[src].visit = true; for (int tar : table[src]){ if (v[tar].flen != v[src].flen - 1)continue; v[tar].line = max(v[tar].line, v[src].line); // 求过该点所有路径中最大line值 v[tar].line = min(v[tar].line, v[tar].dlen); //用该点到贼窝距离更新line值 if (v[tar].visit == false){ q.push(tar); v[tar].visit = true; } } } printf("%d\n", v[f].line); } void func(){ scanf("%d%d", &n, &m); while (m--){ int src, tar; scanf("%d%d", &src, &tar); table[src].push_back(tar); table[tar].push_back(src); } scanf("%d%d%d", &s, &f, &d); BFS(); } int main(){ //freopen("out.txt", "w", stdout); //freopen("in.txt", "r", stdin); func(); }
相关文章推荐
- 【POJ 1408】 Fishnet (叉积求面积)
- jquery学习——遍历
- 开始时间结束时间
- python copy and deeepcopy
- 解决centos系统自定义在rc.local中的脚本不能执行问题小记
- HTTPS 是怎么加密的
- UVA 10735 Euler Circuit (最大流)
- 认识GIT之入门
- Problem 2128 最长子串 (KMP+字符串 好题)
- checkbox选择并批量删除的JSP源码和后台的交互的应用心得
- android 休眠唤醒机制分析(一)
- LoadRunner Controller无法创建Vuser。确保您的Load Generator可用并且脚本有效
- poj 2182 树状数组
- Apache安装
- Spark Core and Cluster Managers(翻译自Learning.Spark.Lightning-Fast.Big.Data.Analysis)
- 第2章 基本数据类型、数组、循环及条件表达式
- IoT service,mqtt,publish topic different from subscribe topic
- axis2之实现方式xmlbeans
- C/C++编程题之大数相乘
- Hibernate3使用(三)Spring整合Hibernate自动扫描