UVa 11374 Airport Express
2016-07-21 08:09
501 查看
题目大意:
给你n个点和起点终点,再告诉你m条经济线路和k条商业线路,经济线路可以无限制经过,但商业线路只能乘坐一次,问从起点到达终点的最短距离和路径,并输出在什么位置换成商业线路。
分析:
枚举每一条商业线路, 计算在当前线路换乘的最小费用, 并更新距离即可,注意在这之前要预处理两次,分别从起点和终点出发计算距离和路径。
代码:
给你n个点和起点终点,再告诉你m条经济线路和k条商业线路,经济线路可以无限制经过,但商业线路只能乘坐一次,问从起点到达终点的最短距离和路径,并输出在什么位置换成商业线路。
分析:
枚举每一条商业线路, 计算在当前线路换乘的最小费用, 并更新距离即可,注意在这之前要预处理两次,分别从起点和终点出发计算距离和路径。
代码:
#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 500 + 10; struct edge { int from, to, dist; }; struct Heapnode { int d, u; bool operator < (const Heapnode& rhs) const { return d > rhs.d; } }; struct Dijkstra { int n, m; vector<edge> edges; vector<int> G[maxn]; bool done[maxn]; int dis[maxn], pre[maxn]; void init(int n) { this -> n = n; for(int i=0; i<n; i++) G[i].clear(); edges.clear(); } void add_edge(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<Heapnode> Q; for(int i=0; i<n; i++) dis[i] = inf; dis[s] = 0; memset(pre, 0, sizeof(pre)); memset(done, false, sizeof(done)); Q.push((Heapnode){0, s}); while(!Q.empty()) { Heapnode x = Q.top(); Q.pop(); int u = x.u; if(done[u]) continue; done[u] = true; for(int i=0; i<(int)G[u].size(); i++) { edge& e = edges[G[u][i]]; if(dis[u] + e.dist < dis[e.to]) { dis[e.to] = dis[u] + e.dist; pre[e.to] = G[u][i]; Q.push((Heapnode){dis[e.to], e.to}); } } } } void Getshortestpaths(int s, int *dist, vector<int>* paths) { dijkstra(s); for(int i=0; i<n; i++) { dist[i] = dis[i]; paths[i].clear(); int t = i; paths[i].push_back(t); while(t != s) { paths[i].push_back(edges[pre[t]].from); t = edges[pre[t]].from; } reverse(paths[i].begin(), paths[i].end()); } } }dij; int u, v, w; int n, m, k, s, t, Case; int dis1[maxn], dis2[maxn]; vector<int> paths1[maxn], paths2[maxn]; void init() { s--, t--; dij.init(n); scanf("%d", &m); for(int i=0; i<m; i++) { scanf("%d%d%d", &u, &v, &w); u--, v--; dij.add_edge(u, v, w); dij.add_edge(v, u, w); } } int main() { #ifndef ONLINE_JUDGE freopen("data.txt", "r", stdin); freopen("ans.txt", "w", stdout); #endif while(scanf("%d%d%d", &n, &s, &t) == 3) { init(); dij.Getshortestpaths(s, dis1, paths1); dij.Getshortestpaths(t, dis2, paths2); int Ticket = -1, Time = dis1[t]; vector<int> path = paths1[t]; scanf("%d", &k); for(int i=0; i<k; i++) { scanf("%d%d%d", &u, &v, &w); u--, v--; for(int j=0; j<2; j++) { if(dis1[u] + w + dis2[v] < Time) { Ticket = u; Time = dis1[u] + w + dis2[v]; path = paths1[u]; for(int l=paths2[v].size() - 1; l>=0; l--) path.push_back(paths2[v][l]); } swap(u, v); } } if(Case++ > 0) printf("\n"); for(int i=0; i<(int)path.size(); i++) printf("%d%c", path[i] + 1, i == (int)path.size()-1 ? '\n' : ' '); if(Ticket == -1) printf("Ticket Not Used\n"); else printf("%d\n", Ticket + 1); printf("%d\n", Time); } return 0; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?