UVA 11374 Airport Express(枚举+最短路)
枚举每条商业线<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(枚举+最短路)的更多相关文章
- UVA 11374 Airport Express(最短路)
最短路. 把题目抽象一下:已知一张图,边上的权值表示长度.现在又有一些边,只能从其中选一条加入原图,使起点->终点的距离最小. 当加上一条边a->b,如果这条边更新了最短路,那么起点st- ...
- UVA 11374 Airport Express (最短路)
题目只有一条路径会发生改变. 常见的思路,预处理出S和T的两个单源最短路,然后枚举商业线,商业线两端一定是选择到s和t的最短路. 路径输出可以在求最短路的同时保存pa数组得到一棵最短路树,也可以用di ...
- UVA - 11374 - Airport Express(堆优化Dijkstra)
Problem UVA - 11374 - Airport Express Time Limit: 1000 mSec Problem Description In a small city c ...
- UVA - 11374 Airport Express (Dijkstra模板+枚举)
Description Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express ...
- UVA 11374 Airport Express SPFA||dijkstra
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)
题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...
- UVa 11374 - Airport Express ( dijkstra预处理 )
起点和终点各做一次单源最短路, d1[i], d2[i]分别代表起点到i点的最短路和终点到i点的最短路,枚举商业线车票cost(a, b); ans = min( d1[a] + cost(a, b ...
- uva 11374 最短路+记录路径 dijkstra最短路模板
UVA - 11374 Airport Express Time Limit:1000MS Memory Limit:Unknown 64bit IO Format:%lld & %l ...
- 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)
layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...
随机推荐
- 好多邮箱的SMTP设置
http://731771490.diandian.com/post/2011-04-20/19576550
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- js中的referrer使用,返回上一页
js完整代码: <script language="javascript"> var refer=document. referrer ; document.g ...
- Citrix 服务器虚拟化之九 Xenserver虚拟机的XenMotion
Citrix 服务器虚拟化之九 Xenserver虚拟机的XenMotion XenMotion 是 XenServer 的一项功能,能够将正在运行的虚拟机从一台 XenServer 主机上迁移到另外 ...
- jQuery中 $ 符号的冲突问题
jQuery中 $ 符号的冲突问题是常见问题之一. 在jQuery中,$是jQuery的别名,为了书写方便,我们更习惯用$('#id')这一类的方式来书写代码.当同一页面引用了jQuery多个版本 ...
- (转)简易WCF负载均衡方案
最近跟高老师讨论nginx跟tomcat集群做负载均衡方案.感觉很有意思.想到自己项目中服务用的WCF技术,于是就想WCF如何做负载均衡,Google了一会,发现wcf4.0的路由服务好像可以实现.不 ...
- 委托,匿名方法,Lambda,泛型委托,表达式树
一.委托:完成一个委托应分三个步骤://step01:首先用delegate定义一个委托;public delegate int CalculatorAdd(int x, int y);//step0 ...
- 6、统计solr目录索引信息
package com.main.java.solr.statistics; import org.apache.lucene.document.Document; import org.apache ...
- (原创) ubuntu 12.04 install nvidia by the deb
先安装 驱动 1. sudo dpkg -i XXX.deb 2. sudo apt-get update 3. sudo apt-get install cuda 4. gedit ~/.bash ...
- 获取本机CPU,硬盘等使用情况
早上的时候接到主管的一个任务,要获取服务器上的cpu,硬盘, 数据库等 的使用情况,并以邮件的方式发给boss, = =没办法,公司的服务器真是不敢恭维,顺便吐槽一下公司的网速,卡的时候30k左右徘徊 ...