枚举每条商业线<a, b>,设d[i]为起始点到每点的最短路,g[i]为终点到每点的最短路,ans便是min{d[a] + t[a, b] + g[b]}。注意下判断是否需要经过商业线。输出也有点坑的,每两组间用空行隔开。。。

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<stack>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define REP(i, n) for(int i=0; i<n; i++)
#define CLR(a, b) memset(a, b, sizeof(a))
#define LL long long
#define PB push_back
#define debug puts("**debug**")
using namespace std; const int maxn = 1000;
const int INF = 10000000;
int n, s, e, m, k, x[maxn], y[maxn], z[maxn], flag;
struct Heap
{
int d, u;
bool operator < (const Heap& rhs) const
{
return d > rhs.d;
}
};
struct Edge
{
int from, to, dist;
};
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[2][maxn], p[2][maxn], path[maxn]; inline void init()
{
REP(i, n+1) G[i].clear(); edges.clear();
} void dij(int s, int cur)
{
priority_queue<Heap> q; q.push((Heap){0, s});
REP(i, n+1) d[cur][i] = INF; d[cur][s] = 0;
CLR(done, 0);
while(!q.empty())
{
Heap x = q.top(); q.pop();
int u = x.u, nc = G[u].size();
if(done[u]) continue;
done[u] = 1;
REP(i, nc)
{
Edge& e = edges[G[u][i]];
if(d[cur][e.to] > d[cur][u] + e.dist)
{
d[cur][e.to] = d[cur][u] + e.dist;
p[cur][e.to] = edges[G[u][i]].from;
q.push((Heap){d[cur][e.to], e.to});
}
}
}
} void add(int from, int to, int dist)
{
edges.PB((Edge){from, to, dist});
edges.PB((Edge){to, from, dist});
int nc = edges.size();
G[from].PB(nc-2);
G[to].PB(nc-1);
} void read()
{
scanf("%d", &m);
REP(i, m)
{
scanf("%d%d%d", &x[i], &y[i], &z[i]);
add(x[i], y[i], z[i]);
}
scanf("%d", &k);
REP(i, k) scanf("%d%d%d", &x[i], &y[i], &z[i]);
} void solve()
{
dij(s, 0);
dij(e, 1);
int ans = d[0][e], tot = d[0][e], a, b;
REP(i, k)
{
int tmp = d[0][x[i]] + d[1][y[i]] + z[i];
if(tmp < ans) ans = tmp, a = x[i], b = y[i];
tmp = d[0][y[i]] + d[1][x[i]] + z[i];
if(tmp < ans) ans = tmp, a = y[i], b = x[i];
}
if(ans == tot)
{
int cnt = 0, u = e; path[cnt++] = e;
while(u != s) path[cnt++] = p[0][u], u = p[0][u];
FD(i, cnt-1, 0) printf("%d%c", path[i], i == 0 ? '\n' : ' ');
puts("Ticket Not Used");
printf("%d\n", tot);
}
else
{
int cnt = 0, tmp[maxn], u = a;
while(u != s) tmp[cnt++] = p[0][u], u = p[0][u];
REP(i, cnt) path[i] = tmp[cnt-i-1]; path[cnt] = a, path[++cnt] = b, cnt++;
u = b;
while(u != e) path[cnt++] = p[1][u], u = p[1][u]; REP(i, cnt) printf("%d%c", path[i], i == cnt - 1 ? '\n' : ' ');
printf("%d\n%d\n", a, ans);
}
} int main()
{
flag = 0;
while(~scanf("%d%d%d", &n, &s, &e))
{
if(flag) puts("");
flag++; init(); read(); solve();
}
return 0;
}

UVA 11374 Airport Express(枚举+最短路)的更多相关文章

  1. UVA 11374 Airport Express(最短路)

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

  2. UVA 11374 Airport Express (最短路)

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

  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. UVA 11374 Airport Express SPFA||dijkstra

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

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

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

  7. UVa 11374 - Airport Express ( dijkstra预处理 )

    起点和终点各做一次单源最短路, d1[i], d2[i]分别代表起点到i点的最短路和终点到i点的最短路,枚举商业线车票cost(a, b);  ans = min( d1[a] + cost(a, 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. Oracle11gRAC安装

    安装Oracle RAC 一.硬件环境 ①用虚拟机搭建两台机器,操作系统都为: [root@node1 ~]# cat /etc/issue Red Hat Enterprise Linux Serv ...

  2. STL中序列式容器的共性

    代码如下: /* * vector_1.cpp * * Created on: 2013年8月6日 * Author: Administrator */ #include <iostream&g ...

  3. (转)iOS Wow体验 - 第五章 - 利用iOS技术特性打造最佳体验

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第五章译文精选,其余章节将陆续放出.上一篇:Wow ...

  4. C++读写CSV文件

    前两天看了<Reading and Writing CSV Files in MFC>(http://www.codeproject.com/Articles/53759/Reading- ...

  5. oracle卸载Oracle Clusterware(转载)

    1.脚本自动删除 切换到root用户 $Su – root #cd $ORA_CRS_HOME/install 1.执行rootdelete.sh脚本 # ./rootdelete.sh 2.执行ro ...

  6. python之面向对象(一)

    python编程分为三个阶段: 面向过程编程:根据业务逻辑从上到下垒 函数式编程:将某功能进行函数封装,使用时调用函数即可,减少代码重复量 面向对象编程:对函数进行分类和封装 理论上我们是比较鄙视面向 ...

  7. 后台js

    Response.Write("<script>alert('该用户名不存在或密码错误或未参加教学活动,请重新输入!');history.back()</script> ...

  8. UIAlertController的创建以及添加

    个人还是更喜欢以前的UIAlertView的创建方法,更新后的UIAlertController虽然说将UIAlertView和UIActionSheet的功能和作用以一种模块化替换的方式来代替,但是 ...

  9. C#holle world

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. Altium Designer 生成 Mach3 G代码的程序

    Altium Designer做PCB设计,还是很方便的,最近头脑发热,在网上买了一套CNC机床,用来做钻孔用,但是翻来翻去,基本上所有的软件都是铣削功能,而且很多软件很复杂.翻了好几天,发现没有什么 ...