uva11374 Airport Express
来源:互联网 发布:淘宝旗舰店怎么开 编辑:程序博客网 时间:2024/05/01 21:33
这道题和hdu4081Qin Shi Huang's National Road System很像 都是需要枚举免费的那条路
主要是要两次预处理 一次是起点到任一点的最短路 再是终点到任一点的最短路
那么对于每一条免费路线(u, v) 答案便是dis[u](起点至u) + dis[v](终点到v) + w(u, v)
//#pragma warning (disable: 4786)//#pragma comment (linker, "/STACK:16777216")//HEAD#include <cstdio>#include <ctime>#include <cstdlib>#include <cstring>#include <queue>#include <string>#include <set>#include <stack>#include <map>#include <cmath>#include <vector>#include <iostream>#include <algorithm>using namespace std;//LOOP#define FF(i, a, b) for(int i = (a); i < (b); ++i)#define FD(i, b, a) for(int i = (b) - 1; i >= (a); --i)#define FE(i, a, b) for(int i = (a); i <= (b); ++i)#define FED(i, b, a) for(int i = (b); i>= (a); --i)#define REP(i, N) for(int i = 0; i < (N); ++i)#define CLR(A,value) memset(A,value,sizeof(A))#define CPY(a, b) memcpy(a, b, sizeof(a))#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)//STL#define SZ(V) (int)V.size()#define PB push_back#define EQ(a, b) (fabs((a) - (b)) <= 1e-10)#define ALL(c) (c).begin(), (c).end()//INPUT#define RI(n) scanf("%d", &n)#define RII(n, m) scanf("%d%d", &n, &m)#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)#define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)#define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)#define RS(s) scanf("%s", s)//OUTPUT#define WI(n) printf("%d\n", n)#define WS(s) printf("%s\n", s)typedef long long LL;typedef unsigned long long ULL;typedef vector <int> VI;const int INF = 100000000;const double eps = 1e-10;const int MAXN = 550;struct Edge{ int from, to, dist;};struct Node{ int d, u; bool operator < (const Node& rhs) const { return d > rhs.d; }};struct Dijkstra{ int n, m; vector<Edge> edges; vector<int> G[MAXN]; bool done[MAXN]; int d[MAXN]; int p[MAXN]; void init(int n) { this->n = n; for (int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void addedge(int from, int to, int dist) { edges.push_back((Edge){from, to, dist}); m = edges.size(); G[from].push_back(m - 1); } void dijkstra(int s) { priority_queue<Node> Q; for (int i = 0; i < n; i++) d[i] = INF; d[s] = 0; memset(done, 0, sizeof(done)); Q.push((Node){0, s}); while (!Q.empty()) { Node x = Q.top(); Q.pop(); int u = x.u; if (done[u]) continue; done[u] = 1; for (int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; p[e.to] = G[u][i]; Q.push((Node){d[e.to], e.to}); } } } }}dij;vector<Edge> ee;int n, s, e, m, k;int ds[MAXN], de[MAXN];int ps[MAXN];void printS(int u){ if (u == s) { printf("%d", s + 1); return; } printS(dij.edges[ps[u]].from); printf(" %d", u + 1);}void printE(int u){ if (u == e) { printf(" %d\n", e + 1); return; } printf(" %d", u + 1); printE(dij.edges[dij.p[u]].from);}int main(){ int x, y, z; int kase = 0; while (~RIII(n, s, e)) { if (kase++) puts(""); dij.init(n); ee.clear(); CLR(ds, 0), CLR(de, 0); RI(m); REP(i, m) { RIII(x, y, z); x--, y--; dij.addedge(x, y, z); dij.addedge(y, x, z); } RI(k); REP(i, k) { RIII(x, y, z); x--, y--; ee.PB((Edge){x, y, z}); ee.PB((Edge){y, x, z}); } s--, e--; dij.dijkstra(s); int ans = dij.d[e]; REP(i, n) { ds[i] = dij.d[i]; ps[i] = dij.p[i]; } dij.dijkstra(e); REP(i, n) de[i] = dij.d[i]; int flag = -1; REP(i, SZ(ee)) { int u = ee[i].from, v = ee[i].to, w = ee[i].dist; if (ds[u] + w + de[v] < ans) { flag = i; ans = ds[u] + de[v] + w; } } if (flag == -1) { printS(e); puts("\nTicket Not Used"); WI(ans); continue; } printS(ee[flag].from); printE(ee[flag].to); WI(ee[flag].from + 1); WI(ans); }}
- uva11374 Airport Express
- UVa11374 Airport Express
- 【UVA11374】Airport Express
- uva11374 - Airport Express 最短路
- uva11374 Airport Express(最短路+枚举)
- UVA11374 Airport Express(SPFA求最短路)
- UVA11374-Airport Express(最短路+枚举)
- UVA11374[Airport Express] dijkstra/spfa+枚举
- Airport Express
- Airport Express
- UVA 11374 - Airport Express
- UVA 11374 Airport Express
- Uva-11374-Airport Express
- UVA 11374 Airport Express
- UVa 11374 Airport Express
- uva 11374/Airport Express
- UVa 11374 - Airport Express
- Uva11374
- Eclipse CDT 中 ** can not be resolved解决方法
- Java面试笔试题(高级部分1)
- 网络扫描技术揭秘读书笔记2--常用的网络编程-其它协议编程
- Rysnc文件同步
- 杨辉三角
- uva11374 Airport Express
- 基于 crt debug 实现的 Windows 程序内存泄漏检测工具
- 40,数据库(02)
- 第一集:远离的故乡 第一章:大乱!
- 如何养成良好的 C++ 编程习惯 —— 内存管理
- Android ListView滑动过程中图片显示重复错乱闪烁问题解决
- 用宏实现 C++ Singleton 模式
- 进程间通信——IPC
- C++ 封装私有堆(Private Heap)