题目大意:

给出一个有向图,求从 顶点a 到 顶点b 的次短路。

第一行是2个正整数 n 和 e,表示该有向图的顶点数和边数。3 < n ≤ 5000 , 3 < e < 40000 。顶点的编号是 1 ~ n 。

接下来 e 行,每行3个正整数 u , v 和 w ,表示一条从 顶点u 指向 顶点v 的弧,权值为 w

接下来是个正整数 Q,表示接下来有Q个询问。

接下来是Q行,每行2个正整数 a 和 b,表示询问从 顶点a 到 顶点b 的次短路长度。

每个询问输出一行结果:

如果不存在次短路,则输出 no route

否则,输出从 顶点a 到 顶点b 的次短路的长度

Sample Input

5 9
2 3 5
1 5 5
3 5 6
1 2 8
1 3 8
5 3 4
4 1 8
4 5 3
5 4 2
6
2 5
1 2
3 1
5 4
1 5
5 2

Sample Output

16
23
21
7
10
23

原本的dis[]数组记录最短路,改为开两个数组dis1[],dis2[]分别记录最短路和次短路

本题还有一个优化操作 因为是多个询问 所以另开一个邻接表记录已经搜索过的从某点出发的次短路

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mp(i,j) make_pair(i,j)
#define P pair<int,int>
using namespace std;
int n,e,dis1[],dis2[];
vector <P> vec[], got[]; // vec为图的邻接表 got为已搜过的次短路
void save(int a)
{
for(int i=;i<=n;i++) /// 将已经得到的次短路结果记录下来
got[a].push_back(mp(i,dis2[i]));
}
void dijk(int a,int b)
{
memset(dis1,INF,sizeof(dis1));
memset(dis2,INF,sizeof(dis2));
priority_queue <P, vector<P>, greater<P> > q;
// 使用pair好处在于 默认对.first排序 使用greater<>升序排序
q.push(mp(,a)); dis1[a]=; while(!q.empty()) {
P u=q.top(); q.pop();
if(dis2[u.second]<u.first) continue; vector <P> ::iterator it;
for(it=vec[u.second].begin();it!=vec[u.second].end();it++) {
int w=u.first+(*it).first;
int sec=(*it).second;
if(w<dis1[sec]) {
swap(dis1[sec],w);
q.push(mp(dis1[sec],sec));
}
if(w<dis2[sec]) {
swap(dis2[sec],w);
q.push(mp(dis2[sec],sec));
}
}
}
if(dis2[b]==INF) printf("no route\n");
else printf("%d\n",dis2[b]);
save(a);
}
int main()
{
scanf("%d%d",&n,&e);
while(e--) {
int u,v,w; scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(mp(w,v));
}
int q; scanf("%d",&q);
while(q--) {
int a,b; scanf("%d%d",&a,&b);
if(got[a].size()>) { /// 已经搜过 直接从got中寻找结果
for(int i=;i<got[a].size();i++)
if(got[a][i].first==b) {
if(got[a][i].second==INF) printf("no route\n");
else printf("%d\n",got[a][i].second);
break;
}
}
else dijk(a,b); /// 否则dijk一下
} return ;
}

次短路 /// dijkstra oj1597的更多相关文章

  1. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  2. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  3. 单源最短路dijkstra算法&&优化史

    一下午都在学最短路dijkstra算法,总算是优化到了我能达到的水平的最快水准,然后列举一下我的优化历史,顺便总结总结 最朴素算法: 邻接矩阵存边+贪心||dp思想,几乎纯暴力,luoguTLE+ML ...

  4. HUD.2544 最短路 (Dijkstra)

    HUD.2544 最短路 (Dijkstra) 题意分析 1表示起点,n表示起点(或者颠倒过来也可以) 建立无向图 从n或者1跑dij即可. 代码总览 #include <bits/stdc++ ...

  5. 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树)

    layout: post title: 训练指南 UVALive - 4080(最短路Dijkstra + 边修改 + 最短路树) author: "luowentaoaa" ca ...

  6. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  7. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  8. 最短路Dijkstra算法的一些扩展问题

    最短路Dijkstra算法的一些扩展问题     很早以前写过关于A*求k短路的文章,那时候还不明白为什么还可以把所有点重复的放入堆中,只知道那样求出来的就是对的.知其然不知其所以然是件容易引发伤痛的 ...

  9. 华夏60 战斗机(最短路dijkstra)

    华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...

随机推荐

  1. Java面向对象的特征一:封装性

    1.4 面向对象的特征一:封装性 当创建了类的对象以后,如果直接通过"对象.属性"的方式对相应的对象属性赋值的话,可能会出现不满足实际情况的意外,我们考虑不让对象来直接作用属性,而 ...

  2. 1、Go语言的介绍

    一.概念 Go语言(Golang)是云计算时代的C语言,使用Go编译的程序可以媲美C/C++代码的速度,而且更加安全.支持并行进程. 二.Go语言的优势 1.部署简单.可以直接编译成机器码,不依赖其他 ...

  3. J2SE基础-环境配置

    学习资料:毕向东视频 1.为何配置Path? 使用javac编译文件时,先找path里设置的java路径. 如果不配置Path,在命令提示行中,则只能进入bin目录后,才能执行javac,jar等命令 ...

  4. bzoj1009题解

    [解题思路] 先KMP出fail数组,再用fail数组求出M[i][j],表示上一次匹配到第i位,这次可以遇到多少种不同的字符,使之转而匹配到第j位. 设集合S=[1,m]∩N 又设f[i][j]表示 ...

  5. NX二次开发-UFUN和NXOpen结合开发中Tag_t对象与TaggedObject对象转换方法

    本文通过举四个例子来告诉大家在NX二次开发过程中会经常用到UFUN和NXOpen结合去开发,在UFUN中我们得到的是Tag_t对象,在NXOpen中得到的是TaggedObject对象,这两个是需要进 ...

  6. 原生js实现文件下载并设置请求头header

    原生js实现文件下载并设置请求头header const token="自行定义";//如果有 /** * 向指定路径发送下载请求 * @param{String} url 请求路 ...

  7. CSDN首页> 云计算 孙玄:解析58同城典型技术架构及演变

    转:http://www.csdn.net/article/2015-04-09/2824437 在UPYUN主办的“UPYUN Open Talk”第三期北京站上,58同城系统架构师孙玄详细介绍了5 ...

  8. Go语言中new()和 make()的区别详解

    概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似.不过解释两者之间的不同也非常容易. new 的主要特性 首先 new 是内建函数,你可以从 http://gol ...

  9. 20-MySQL-Ubuntu-数据表的查询-子查询(九)

    子查询(嵌套查询) select * from students where height=(select max(height) from students);

  10. 18-MySQL-Ubuntu-数据表的查询-连接(七)

    students与classes表,两个表的连接字段是students.cls_id=classes.ID (1) 左连接:left join on 左边表全取,右边表取共有的,没有的为null se ...