枚举每条商业线<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. 用Scrapy写一个爬虫

    昨天用python谢了一个简单爬虫,抓取页面图片: 但实际用到的爬虫需要处理很多复杂的环境,也需要更加的智能,重复发明轮子的事情不能干, 再说python向来以爬虫作为其擅长的一个领域,想必有许多成熟 ...

  2. js bom中浏览器兼容问题判断代码

    var btn = document.getElementById('d1');if(addEventListener===undefined){ btn.attachEvent('onclick', ...

  3. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  4. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  5. 安装MySQL和Navicat,并与MyEclipse连接

    1.下载安装MySQL 1)到http://dev.mysql.com/downloads/下载MySQL社区版Server,和用于JDBC的Connector.一路默认安装就可以,须要注意的是记住M ...

  6. OLE-DB 操作excel 基本

    1 方法用例   *&---------------------------------------------------------------------* *& 本程序总结了常 ...

  7. Samba通过ad域进行认证并限制空间大小《转载》

    本文实现了samba服务被访问的时候通过windows域服务器进行用户名和密码验证;认证通过的用户可以自动分配500M的共享空间;在用户通过windows域登陆系统的时候可以自动把这块空间映射成一块硬 ...

  8. VS2015 添加DNX SDK

    第一次运行VS2015,添加第一个ASP.NET 5程序时会报一个错误“DNX SDK版本 “dnx-clr-win-x86.1.0.0-beta5”无法安装. 解决办法: 打开CMD :输入 @po ...

  9. 掌握jQuery插件开发,这篇文章就够了

    ---恢复内容开始--- 在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及数据jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足形影 ...

  10. 伸缩放大的js

    window.onload = function() {         var div1 = document.getElementById('div1');         div1.onmous ...