POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 16425 | Accepted: 5797 |
Description
Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path.
The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N.
The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path).
Input
Lines 2..R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)
Output
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
Hint
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
#define MAX_N 5010
#define INF 2147483647 typedef pair<int,int> P; //first是最短距离,second是顶点编号 struct edge{
int to,cost;
}; int n,r; //顶点数,边数
vector <edge> G[MAX_N]; //图的邻接表表示,G[x]表示点x相连的所有的边的集合 int dist1[MAX_N]; //最短路径
int dist2[MAX_N]; //次短路径 void solve(){
//通过指定greater<P>参数,堆按照first从小到大的顺序取出值。
priority_queue<P, vector<P>, greater<P> > que;
fill(dist1, dist1+n, INF);
fill(dist2, dist2+n, INF);
dist1[] = ;
que.push(P(,)); while(!que.empty()){
P p = que.top(); que.pop();
int v = p.second, d = p.first;//取出编号和距离 //如果次短距离比之前加入这个点短,说明加入这个点之后又更新过
//这里continue相当于一种剪枝,没有这句也不会错,但是加了效率会变高
if(dist2[v] < d) continue; //遍历取出的点所连接的所有点
for(int i = ;i < G[v].size(); i++){
edge &e = G[v][i];
int d2 = d + e.cost; //表示当前点可以更新所连接的点的最短路径
if(dist1[e.to] > d2){
swap(dist1[e.to] ,d2); //把之前的距离取出来,更新次短路径
que.push(P(dist1[e.to], e.to)) ; // 把更新过的点加入队列,用这个点去更新其他点
}
//如果d2没有更新过这个点的最短路径,就直接用d2更新次短路径
//如果d2更新过这个点的最短路径,就用d2交换出来的值更新次短路径
if(dist2[e.to] > d2 && dist1[e.to] < d2){
dist2[e.to] = d2;
que.push(P(dist2[e.to], e.to));
}
}
}
printf("%d\n",dist2[n-]);
} int main(){
cin >> n >> r;
int x,y,d;
for(int i = ;i < r; i++){
edge e;
cin >> x >> y >> d;
e.cost = d;e.to = y-;
G[x-].push_back(e);
e.to = x-;
G[y-].push_back(e);
}
solve();
return ;
}
POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)的更多相关文章
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...
- POJ 3255 Roadblocks(A*求次短路)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 12167 Accepted: 4300 Descr ...
- POJ 3255 Roadblocks (次级短路问题)
解决方案有许多美丽的地方.让我们跳回到到达终点跳回(例如有两点)....无论如何,这不是最短路,但它并不重要.算法能给出正确的结果 思考:而最短的路到同一点例程.spfa先正达恳求一次,求的最短路径的 ...
- POJ 3255 Roadblocks (次短路模板)
Roadblocks http://poj.org/problem?id=3255 Time Limit: 2000MS Memory Limit: 65536K Descriptio ...
- poj 3255 Roadblocks
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13216 Accepted: 4660 Descripti ...
- poj 3255 Roadblocks 次短路(两次dijksta)
Roadblocks Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
- POJ 3255 Roadblocks (次短路 SPFA )
题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...
- POJ 3255 Roadblocks (次短路)
题意:给定一个图,求一条1-n的次短路. 析:次短路就是最短路再长一点呗,我们可以和求最短路一样,再多维护一个数组,来记录次短路. 代码如下: #pragma comment(linker, &quo ...
- POJ 3255 Roadblocks --次短路径
由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...
随机推荐
- ROS-SLAM-自主导航
前言:无. 前提:已下载并编译了相关功能包集,如还未下载,可通过git下载:https://github.com/huchunxu/ros_exploring.git 一.启动仿真环境 cd ~/ca ...
- c#设计模式(1)
本文摘取自吕震宇的博客园文章,版权归吕震宇仅供个人学习参考.转载请标明原作者吕震宇. 这学期开设设计模式课程,将课件放上来. 课本:<C#设计模式>,电子工业出版社,ISBN 7-5053 ...
- git工具的安装和使用
啰嗦几句: 世界上本没有后悔药,但软件开发提供了后悔药,那就是代码管理工具.它可以让你的代码穿越回以前的状态,甚至可以指定某一个时刻,而且还可以穿越回来. 当下流行的代码管理工具有 SVN 和 GIT ...
- 在vue中使用less
首先vue环境搭建成功 第一步: 安装 less 和less-loader 安装less依赖:npm install less less-loader --save 第二步: 修改webpack.ba ...
- Android Finalizing a Cursor that has not been deactivated or closed
问题描述: 使用Sqlite数据库时,有时候会报下面的异常: Finalizing a Cursor that has not been deactivated or closed 一个光标没有被停用 ...
- RecyclerView的刷新和加载更多
1.RecyclerView :出现也不知道多久了,没怎么使用过,上次写的笔记乱七八糟的,再次仔细的整理下. 使用需加入依赖 compile 'com.android.support:recyc ...
- 【node.js web项目】解决路由默认是hash模式(带#)
[概念讲述] 1.什么是hash模式 Vue+WebPack项目,本身是一个单页应用. vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 ...
- UNP学习笔记1——基本TCP套接字编程
1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...
- maven的pom.xml配置json依赖
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</art ...
- TensorFlow+实战Google深度学习框架学习笔记(7)-----队列与多线程
一.创建一个队列: FIFOQueue:先进先出 RandomShuffleQueue:会将队列中的元素打乱,每次出列操作得到的是从当前队列所有元素中随机选择的一个. 二.操作一个队列的函数: enq ...