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 ...
随机推荐
- 第五篇:浅谈CPU 并行编程和 GPU 并行编程的区别
前言 CPU 的并行编程技术,也是高性能计算中的热点,也是今后要努力学习的方向.那么它和 GPU 并行编程有何区别呢? 本文将做出详细的对比,分析各自的特点,为将来深入学习 CPU 并行编程技术打下铺 ...
- PyQt4预定义对话框
PyQt4中的对话框 对话窗口和对话框是现代GUI应用程序必不可少的一部分.生活中“对话”被定义为发生在两人或更多人之间的会话.而在计算机世界,“对话”则时人与应用程序之间的“会话”.人及对话的形式有 ...
- shiro-filter执行流程
web中 在xml中配置 <filter> <filter-name>shiroFilter</filter-name> <filter-class>o ...
- JS Date parse
因为JS中的Date转换格式没有“-”这种间隔符,Date.parse会生成NAN,所以只能进行转换. <script type="text/javascript"> ...
- 如何理解精通PHP ?
「精通 PHP」可以理解为以下三个: 精通「PHP 解析器 精通「PHP 语法.函数(这门语言) 精通「PHP 项目开发 1 精通「PHP 解析器」 可以从这里开始学习: PHP核心:骇客指南 :ht ...
- 日记整理---->2016-11-01
这里我们整理一下项目的流程,一般来说做一个模块之前.会有需求文档.页面原型和接口文档. 一. js获取radio的值 页面的html代码: <ul class="list-group& ...
- MQTT-SN协议乱翻之小结篇
前言 这里简单做一些小结和对比,针对前面的协议翻译部分,一阶段的学习完结. MQTT-SN VS MQTT MQTT-SN基于MQTT原有语义,但做了很多的调整.比如: 一个CONNECT消息被拆分为 ...
- SSL安装方法二:Windows Server 2008安装SSL证书(IIS 7.5)
SSL证书CSR和CA证书唯一的区别就在:申请证书中的通用名称,具体还要看具体的项目这里只做参考.可以参考SSL安装方法一 背景:IIS 7.5 一.收到SSL证书 仔细阅读邮件 按步骤进行: 1) ...
- Linux系统下Nginx+PHP 环境安装配置
一.编译安装Nginx 官网:http://wiki.nginx.org/Install 下载:http://nginx.org/en/download.html # tar -zvxf nginx- ...
- 从零打造在线网盘系统之SSH框架整合
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...