起点和终点各做一次单源最短路, d1[i], d2[i]分别代表起点到i点的最短路和终点到i点的最短路,枚举商业线车票cost(a, b);  ans = min( d1[a] + cost(a, b) + d2[b] );

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue> using namespace std; const int MAXN = ;
const int INF = << ; struct HeapNode
{
int d, u;
HeapNode() { }
HeapNode( int _d, int _u ): d(_d), u(_u) { }
bool operator<( const HeapNode& rhs ) const
{
return d > rhs.d;
}
}; struct Edge
{
int from, to, dist;
Edge() { }
Edge( int f, int t, int d ) : from(f), to(t), dist(d) { }
}; int N, S, E; struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[MAXN];
bool done[MAXN];
int d1[MAXN];
int d2[MAXN];
int p1[MAXN];
int p2[MAXN]; void init( int n )
{
this->n = n;
for ( int i = ; i <= n; ++i ) G[i].clear();
edges.clear();
return;
} void AddEdge( int from, int to, int dist )
{
edges.push_back( Edge( from, to, dist ) );
m = edges.size();
G[from].push_back(m - );
return;
} void dijkstra( int s, int *d, int *p )
{
priority_queue<HeapNode> Q;
for ( int i = ; i <= n; ++i ) d[i] = INF;
d[s] = ;
memset( done, , sizeof(done) );
Q.push( HeapNode( , s ) );
while ( !Q.empty() )
{
HeapNode 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( HeapNode( d[e.to], e.to ) );
}
}
}
return;
} void Print1( int e )
{
if ( e == S )
{
printf( "%d", S );
return;
}
Edge& tp = edges[ p1[e] ];
Print1( tp.from );
printf( " %d", e );
return;
} void Print2( int e )
{
if ( e == E )
{
printf( " %d", E );
return;
}
Edge& tp = edges[ p2[e] ];
printf( " %d", e );
Print2( tp.from );
return;
} }; int M, K;
Dijkstra slv;
vector<Edge> ec; //经济线路 int main()
{
//freopen( "UVa_11374.in", "r", stdin );
//freopen( "UVa_11374.out", "w", stdout );
int cas = ;
while ( scanf( "%d%d%d", &N, &S, &E ) == )
{
slv.init( N );
scanf( "%d", &M );
for ( int i = ; i < M; ++i )
{
int u, v, cost;
scanf( "%d%d%d", &u, &v, &cost );
slv.AddEdge( u, v, cost );
slv.AddEdge( v, u, cost );
} ec.clear();
scanf( "%d", &K );
for ( int i = ; i < K; ++i )
{
int u, v, cost;
scanf( "%d%d%d", &u, &v, &cost );
ec.push_back( Edge(u, v, cost) );
} slv.dijkstra( S, slv.d1, slv.p1 );
slv.dijkstra( E, slv.d2, slv.p2 ); // for ( int i = 1; i <= N; ++i )
// {
// printf("%d %d\n", slv.d1[i], slv.d2[i] );
// } int ans = slv.d1[E];
int huan = -;
int huaned; for ( int i = ; i < K; ++i )
{
int u = ec[i].from;
int v = ec[i].to;
int tmp1 = slv.d1[u] + ec[i].dist + slv.d2[v];
int tmp2 = slv.d1[v] + ec[i].dist + slv.d2[u];
if ( tmp1 < ans )
{
ans = tmp1;
huan = u;
huaned = v;
}
if ( tmp2 < ans )
{
ans = tmp2;
huan = v;
huaned = u;
}
} if (cas) puts("");
++cas; if ( huan == - )
{
slv.Print1(E);
puts("");
puts("Ticket Not Used");
}
else
{
slv.Print1(huan);
slv.Print2(huaned);
puts("");
printf( "%d\n", huan );
}
printf( "%d\n", ans ); }
return ;
}

UVa 11374 - Airport Express ( dijkstra预处理 )的更多相关文章

  1. UVA - 11374 Airport Express (Dijkstra模板+枚举)

    Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...

  2. UVA - 11374 - Airport Express(堆优化Dijkstra)

    Problem    UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...

  3. UVA 11374 Airport Express SPFA||dijkstra

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  5. UVA 11374 Airport Express (最短路)

    题目只有一条路径会发生改变. 常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路. 路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用di ...

  6. UVA 11374 Airport Express(最短路)

    最短路. 把题目抽象一下:已知一张图,边上的权值表示长度.现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小. 当加上一条边a->b,如果这条边更新了最短路,那么起点st- ...

  7. UVA 11374 Airport Express(枚举+最短路)

    枚举每条商业线<a, b>,设d[i]为起始点到每点的最短路,g[i]为终点到每点的最短路,ans便是min{d[a] + t[a, b] + g[b]}.注意下判断是否需要经过商业线.输 ...

  8. uva 11374 最短路+记录路径 dijkstra最短路模板

    UVA - 11374 Airport Express Time Limit:1000MS   Memory Limit:Unknown   64bit IO Format:%lld & %l ...

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

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

随机推荐

  1. c#按钮如何避免重复点击后报错

    前言:感谢51·halcon的绝地武士大佬啊,虽然你不认识我,但是我从你那学到了很多知识,真的感谢您对知识的无私传播哈哈(两天一个博客有在坚持的,都是草稿,等这个实习阶段过去了再回来整理博客~) bt ...

  2. Mac 修改用户环境变量

    Mac 修改用户环境变量 sudo vim ~/.bash_profile

  3. C# foreach语句

    一.C# foreach语句 foreach语句能够对实现Ienumerable接口的容器进行遍历,并提供一个枚举器来实现Ienumerable接口.foreach语句为数组或对象集合中的各个元素执行 ...

  4. java Web 常见错误集锦 及解决方法

    只能删除pid为整数的商品,32位的pid商品不能删除? 原因onclick="agree('${s.pid}')"  括号中需要加 ' ' 删除多余的工作空间? 使用prefer ...

  5. 基于mybatis设计简单信息管理系统1

    驼峰式命名法 骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始:第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如:myFirs ...

  6. 两种js方法发起微信支付:WeixinJSBridge,wx.chooseWXPay区别

    原文链接:https://www.2cto.com/weixin/201507/412752.html 1.为什么会有两种JS方法可以发起微信支付? 当你登陆微信公众号之后,左边有两个菜单栏,一个是微 ...

  7. win7同时安装python2和python3

    1.下载python2和python3版本. 2.安装python3   1>选择添加PATH路径到系统.   2>为所有用户安装python. 3.安装python2   1>为所 ...

  8. java多线程批量读取文件(七)

    新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一 ...

  9. ArrayList & Vector的源码实现

    #ArrayList & Vector #####前言: 本来按照计划,ArrayList和Vector是分开讲的,但是当我阅读了ArrayList和Vector的源码以后,我就改变了注意,把 ...

  10. LoadRunner使用代理远程执行提示找不到“pre_cci.c”文件

    好久没有使用LoadRunner了,工作需要使用一下,执行总是提示找不到“pre_cci.c”文件,找问题花了很长时间终于找到问题了.万事还是需要找到原因: cci 会将 pre_cci.c 文件作为 ...