最短路问题。

从起点和终点开始各跑一次dijkstra,可以得到起点、终点到任意点的距离。枚举使用的商业线路,找最优解。

破题卡输出,记录前驱和输出什么的仿佛比算法本身还麻烦。

/*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,S,E;
struct exp{
int x,y,w;
}ex[mxn];
struct edge{
int v,nxt,dis;
}e[mxn<<];
int hd[mxn],mct=;
void add_edge(int u,int v,int d){
e[++mct].v=v;e[mct].nxt=hd[u];e[mct].dis=d;hd[u]=mct;
return;
}
struct node{
int v,d;
bool operator < (const node r) const {return d>r.d;}
};
priority_queue<node>tp;
int pre[mxn],nxt[mxn];
int dis[mxn];
int mdis[mxn];
void Dij1(int st){
while(!tp.empty())tp.pop();
memset(dis,0x3f,sizeof dis);
tp.push((node){st,});
dis[st]=;
while(!tp.empty()){
node tmp=tp.top();tp.pop();
if(tmp.d>dis[tmp.v])continue;
int u=tmp.v;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].dis){
dis[v]=dis[u]+e[i].dis;
pre[v]=u;
tp.push((node){v,dis[v]});
}
}
}
return;
}
void Dij2(int st){
while(!tp.empty())tp.pop();
memset(dis,0x3f,sizeof dis);
tp.push((node){st,});
dis[st]=;
while(!tp.empty()){
node tmp=tp.top();tp.pop();
if(tmp.d>dis[tmp.v])continue;
int u=tmp.v;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].dis){
dis[v]=dis[u]+e[i].dis;
nxt[v]=u;
tp.push((node){v,dis[v]});
}
}
}
return;
}
int st[mxn],top=;
void init(){
memset(hd,,sizeof hd);
memset(pre,,sizeof pre);
memset(nxt,,sizeof nxt);
mct=;top=;
} int main(){
int i,j;
bool flag=;
while(scanf("%d%d%d%d",&n,&S,&E,&m)!=EOF){
if(flag){
printf("\n");
}
flag=;
init();
int u,v,w;
for(i=;i<=m;i++){
u=read();v=read();w=read();
add_edge(u,v,w);
add_edge(v,u,w);
}
k=read();
for(i=;i<=k;i++){
ex[i].x=read();ex[i].y=read();
ex[i].w=read();
}
Dij1(S);
memcpy(mdis,dis,sizeof dis);
Dij2(E);
int pos1=,pos2=,ans=1e9;
for(i=;i<=n;i++){
if(ans>mdis[i]+dis[i]){
ans=mdis[i]+dis[i];
pos1=i;
}
}
for(i=;i<=k;i++){
int tmp=mdis[ex[i].x]+dis[ex[i].y]+ex[i].w;
if(ans>tmp){
ans=tmp;pos1=ex[i].x;pos2=ex[i].y;
}
tmp=mdis[ex[i].y]+dis[ex[i].x]+ex[i].w;
if(ans>tmp){
ans=tmp;pos1=ex[i].y;pos2=ex[i].x;
}
}
if(pos1 && !pos2){
// printf("Test1\n");
int tmp=pos1;
while(pre[pos1]){
pos1=pre[pos1];
st[++top]=pos1;
}
while(top) printf("%d ",st[top--]);
pos1=tmp;
do{
printf("%d",pos1);
if(nxt[pos1])printf(" ");
pos1=nxt[pos1];
}while(pos1);
printf("\nTicket Not Used\n");
}
else{
if(pos1 && pos2){
int tmp=pos1;
while(pre[pos1]){
pos1=pre[pos1];
st[++top]=pos1;
}
while(top) printf("%d ",st[top--]);
pos1=tmp;
printf("%d ",pos1);
// pos2=nxt[pos2];
while(pos2){
printf("%d",pos2);
if(nxt[pos2])printf(" ");
pos2=nxt[pos2];
}
printf("\n%d\n",pos1);
}
}
printf("%d\n",ans);
}
return ;
}

Uva11374 Airport Express的更多相关文章

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

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

  2. UVA11374 Airport Express 正反两次最短路

    问题描述 洛谷(有翻译) 吐槽 一道坑题. 如何对待商务票 因为商务票只有一张,所以在\(k\)条边中只有一条边会被选中,很显然,最后这条边会被枚举. 如何选择使用商务票的边 假设我们正在枚举这条边, ...

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

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

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

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

  5. BNUOJ 19792 Airport Express

    Airport Express Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...

  6. UVA 11374 Airport Express SPFA||dijkstra

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

  7. 【uva11374】Airport Express 最短路

    题意: 在Iokh市中,机场快线是市民从市内去机场的首选交通工具.机场快线分为经济线和商业线两种,线路,速度和价钱都不同.你有一张商业线车票,可以坐一站商业线,而其他时候只能乘坐经济线.假设换乘时间忽 ...

  8. Airport Express UVA - 11374

    In a small city called Iokh, a train service, Airport-Express, takes residents to the airport more q ...

  9. UVA 11374 Airport Express(最短路)

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

随机推荐

  1. 阿里云Center OS 6.2 Nginx 配置 SSL/TLS HTTPS配置

    1.通过https://www.startssl.com/ 免费SSL证书 STARTSSL 跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:S ...

  2. [LINK]Scribe

    http://www.361way.com/scribe-chukwa-kafka-flume/4119.html

  3. datahub

    https://help.aliyun.com/document_detail/27854.html

  4. ASP.NET MVC3入门教程之环境搭建

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=90&extra=page%3D1 什么是ASP.NET MVC ...

  5. HTML5之CSS3 3D transform 剖析式学习之一

    最近坐地铁发现“亚洲动物基金”在地铁上做了很多公益广告,比较吸引人的是一个月熊的广告.做的很可爱.回去就搜了一下,发现这个网站是HTML5做的,非常炫. 所以想学习一下,方法就是传统的学习办法,模仿. ...

  6. VMware精简系统Win系列|体积更小更稳定

    此Win系列基于VMware10 给个我自用的超精简VM10.0.3 XP重新制作体积大了一点但更稳定,压缩包166M 制作了Win 2003,压缩包171.4M Win7重新制作体积更小更稳定,压缩 ...

  7. Hibernated的sql查询

    记录一下学习Hibernate的心得 1.为什么HIbernate会支持原生态的sql查询? HQL查询语句虽然方便我们查询,但是基于HQL的查询会将查询出来的对象保存到hibernate的缓存当中, ...

  8. jquery slide使用总结

    .slideUp([duration][,complete])--目标元素向上滑入隐藏: .slideDown([duration][,complete])--目标元素向下滑出显示: .slideTo ...

  9. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  10. truncate与delete的区别

    TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源 ...