Uva11374 Dijkstra
机场快线是市民从市内去机场的首选交通工具。机场快线分为经济线和商业线两种,线路、速度和价格都不同,你有一张商业线车票,可以坐一站商业线,而其他时候,只能乘坐经济线。假设换乘时间忽略不计,你的任务是找一条去机场最快的路线。
这样我们先从起点开始做一次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的更多相关文章
- UVA-11374 Airport Express (dijkstra+枚举)
题目大意:n个点,m条无向边,边权值为正,有k条特殊无向边,起止点和权值已知,求从起点到终点的边权值最小的路径,特殊边最多只能走一条. 题目分析:用两次dijkstra求出起点到任何一个点的最小权值, ...
- 最短路算法详解(Dijkstra/SPFA/Floyd)
新的整理版本版的地址见我新博客 http://www.hrwhisper.me/?p=1952 一.Dijkstra Dijkstra单源最短路算法,即计算从起点出发到每个点的最短路.所以Dijkst ...
- Dijkstra 单源最短路径算法
Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年 ...
- 最短路径算法-Dijkstra
Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- POJ 2253 Frogger(Dijkstra)
传送门 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 39453 Accepted: 12691 Des ...
- POJ 2387 Til the Cows Come Home(最短路 Dijkstra/spfa)
传送门 Til the Cows Come Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 46727 Acce ...
- Dijkstra 算法
all the nodes should be carectorized into three groups: (visited, front, unknown) we should pay spec ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
随机推荐
- GIS-007-Terrain跨域访问
方法一: 在数据服务目录中添加一个Web.config文件,文件内容是: <?xml version="1.0" encoding="UTF-8"?> ...
- 09python之运算
运算 算数运算: 两个数相除,得到商和余数的数组的内置方法 数据.__divmod__() 场景 数据库共99条数据,每个页面10条数据,需要多少个页面 >>> a = 98 ...
- hasattr() 、getattr() 、setattr()
hasattr(object, name) :用于判断一个对象中是否有指定的属性或方法,如果存在返回 True,否则返回 False getattr(object, name, [default]) ...
- 切换sprite
using UnityEngine; using System.Collections; public class BTN : MonoBehaviour { void Awake () { //s ...
- STM32学习之路之MDK安装篇
- IOS视频播放器的制作
利用自带MPMoviePlayerController来实现视频播放,首先要在项目中导入MediaPlayer.Framework框架包. 在视图控制器中 #import "MediaPla ...
- WPS Word查询某些内容的出现次数
1.CTRL+F 打开查找窗体
- Java可视化JVM监控软件
jdk自带.jdk安装目录下 1.JConsole 选择 不安全 可用不多 2.VisualVM
- mysql 之 group by 性能优化 查询与统计分离
背景介绍 记录共128W条! SELECT cpe_id, COUNT(*) restarts FROM business_log WHERE operate_time>='2012-12- ...
- eclipse项目更换svn共享库
eclipse项目更换svn共享库 参考内容: http://blog.csdn.net/yang5726685/article/details/59111586 已经共享过的svn项目,更换资源库时 ...