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 ...
随机推荐
- c指针点滴三(指针运算)
#include <stdio.h> #include <stdlib.h> void main3() { ; int *p = # p++;//不可预测的值 ...
- (转)iOS7界面设计规范(12) - UI基础 - 品牌
重要:这是针对于正在开发中的API或技术的预备文档(预发布版本).虽然该文档在技术精确度上经过了严格的审核,但并非最终版本,仅供苹果开发者计划的注册会员使用.苹果提供这份机要文档的目的,是帮助你按照文 ...
- Vue + element-ui
在Vue-cli生成的项目中使用 element-ui,按照官方的指导 npm i element-ui -D 执行之后,查看package.json,element-ui 加在了 "dev ...
- Android ActionBar完全解析,使用官方推荐的最佳导航栏(下) .
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/25466665 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工 ...
- css重点
1.CSS的盒子模型? (1)两种, IE 盒子模型.标准 W3C 盒子模型:IE 的content部分包含了 border 和 pading; (2)盒模型: 内容(content).填充(padd ...
- 本地开发时同时启动多个tomcat服务器
1.环境变量中不要设置CATALINA_HOME: 2.分别修改安装目录下的conf子目录中的server.xml文件: a.修改http访问端口(默认为 8080端口),将8080修改为tomcat ...
- UITableView 属性集合
UITableView-------表视图--继承UIScrollView并遵守NSCoding协议 属性 frame-------------设置控件的位置和大小 backgroundColor-- ...
- 1、shell 简介
Shell 本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥 梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地 ...
- hdu5358 First One(尺取法)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud First One Time Limit: 4000/2000 MS (Java/ ...
- 关于C函数的参数个数的问题
本文引自:http://c.biancheng.net/cpp/html/1592.html 一个函数的参数的数目没有明确的限制,但是参数过多(例如超过8个)显然是一种不可取的编程风格.参数的数目直接 ...