机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路、速度和价格都不同,你有一张商业线车票,可以坐一站商业线,而其他时候,只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线。

这样我们先从起点开始做一次dijkstra 然后在从终点开始做一次dijkstra, 然后枚举每个商业边。

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int INF =;
const int maxn = +;
struct Edge{
int from,to,dist;
};
struct HeapNoda{
int d,u;
bool operator <(const HeapNoda &rhs)const{
return d>rhs.d;
}
};
struct Dijkstra{
int n,m;
vector<Edge> edges;
vector<int>G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];
void inti(int n){
this->n=n;
for(int i=; i<n; ++i) G[i].clear();
edges.clear();
}
void AddEdge(int from, int to, int dist){
edges.push_back((Edge){from,to,dist});
m = edges.size();
G[from].push_back(m-);
}
void dijkstra(int s){
priority_queue<HeapNoda> Q;
for(int i=; i<n; i++ ) d[i]=INF;
d[s]=;
memset(done,,sizeof(done));
Q.push((HeapNoda){,s});
while(!Q.empty()){
HeapNoda x = Q.top(); Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] =true;
for(int i=; i<G[u].size(); ++i){
Edge &e = edges[G[u][i]];
if(d[e.to]>d[u]+e.dist){
d[e.to] = d[u] +e.dist;
p[e.to] = G[u][i];
Q.push((HeapNoda){d[e.to],e.to});
}
}
}
}
void GetshortPaths(int s, int *dist, vector<int> *paths){
dijkstra(s);
for(int i=; i<n; i++){
dist[i]=d[i];
paths[i].clear();
int t = i;
paths[i].push_back(t);
while(t!=s){
paths[i].push_back( edges[p[t]].from );
t = edges[ p[t] ].from;
}
reverse(paths[i].begin(),paths[i].end());
}
}
};
Dijkstra solver;
int d1[maxn], d2[maxn];
vector<int> paths1[maxn], paths2[maxn];
int main()
{
int N,S,E,M,kase=,X,Y,Z,K;
while(scanf("%d%d%d",&N,&S,&E) == ){
S-- ; E--;
scanf("%d",&M);
solver.inti(N);
for(int i=; i<M; ++i){
scanf("%d%d%d",&X,&Y,&Z);X--; Y--;
solver.AddEdge(X,Y,Z);
solver.AddEdge(Y,X,Z);
}
solver.GetshortPaths(S,d1,paths1);
solver.GetshortPaths(E,d2,paths2);
int ans = d1[E];
vector<int>path = paths1[E];
int midpoint=-;
scanf("%d",&K);
for(int i=; i<K; ++i){
scanf("%d%d%d",&X,&Y,&Z); X--; Y--;
for(int j=; j<; j++){
if(d1[X]+d2[Y]+Z<ans){
ans=d1[X]+d2[Y]+Z;
path=paths1[X];
midpoint=X;
for(int a = paths2[Y].size()-; a>=; a--){
path.push_back( paths2[Y][a] );
}
}
swap(X,Y);
}
}
if(kase) printf("\n");
kase=;
for(int i=; i<path.size()-; i++)
printf("%d ",path[i]+);
printf("%d\n",E+);
if(midpoint==-) printf("Ticket Not Used\n");
else printf("%d\n",midpoint+);
printf("%d\n",ans);
}
return ;
}

Uva11374 Dijkstra的更多相关文章

  1. UVA-11374 Airport Express (dijkstra+枚举)

    题目大意:n个点,m条无向边,边权值为正,有k条特殊无向边,起止点和权值已知,求从起点到终点的边权值最小的路径,特殊边最多只能走一条. 题目分析:用两次dijkstra求出起点到任何一个点的最小权值, ...

  2. 最短路算法详解(Dijkstra/SPFA/Floyd)

    新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...

  3. Dijkstra 单源最短路径算法

    Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...

  4. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  5. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  6. POJ 2253 Frogger(Dijkstra)

    传送门 Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 39453   Accepted: 12691 Des ...

  7. POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)

    传送门 Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 46727   Acce ...

  8. Dijkstra 算法

    all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...

  9. 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)

    题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...

随机推荐

  1. 微信小程序 ui框架(辅助)

    WeUi: https://weui.io/ https://github.com/weui/weui-wxss/ Wa-Ui: https://github.com/liujians/Wa-UI/w ...

  2. /etc/hostname

    我们可以使用 hostname 命令来修改主机名,但只是临时生效,如果想永久生效可以编辑 /etc/hostname 文件,注意不是每个 Linux 发行版都有该文件 root@Ubuntu_Lee: ...

  3. 新唐ARM9之NUC972学习历程之系统的搭建和BSP包的使用

    说到嵌入式,我们首先想到的,就是它的复杂程度,LINUX,BSP,UBOOT,交叉编译,寄存器配置,等等一系列的问题,甚至有的时候我们对此一头雾水,很是头疼,不过我们今天要说的就是关于NUC972的一 ...

  4. iOS 数据类型转换

    1.NSString转化为UNICODE String:(NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname c ...

  5. C++中的抽象基类示例

    抽象基类(abstract base class,ABC)例子:圆与椭圆.建立一个基类BaseEllipse,建立它的恋歌继承了Ellipse和Circle.ellipse.h #ifndef ELL ...

  6. 部署软件RDMA的步骤

    date:  2018-08-28   19:46:56 参考原文原文:http://corasql.blog.51cto.com/5908329/1930455                    ...

  7. [SQL] sql server中如何查看执行效率不高的语句

    sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...

  8. android 软键盘回车键捕获

    EditText editText2 = (EditText)findViewById(R.id.txtTest2); editText2.setOnEditorActionListener(new ...

  9. Mac - 苹果电脑mac系统释放硬盘空间方法汇总

    硬盘空间是大家最头痛的一个问题,大家在硬盘空间变小的时候怎么腾空间的呢?下面为大家分享7个mac系统释放空间的高级方法,大家赶紧来收了! mac系统释放硬盘空间方法: 方法一:删除Emacs--可以节 ...

  10. couldn't connect to host

    “couldn't connect to host” 这样的错误可能是主机不可到达,或者端口不可到达. ping OK只代表主机可以到达. 端口不可到达可能是由于HTTP 服务器未启动或者监听在其他端 ...