有2中种类型的路 第二种只能用一条 求出起点到所有点的最短路和终点到所有点的最短路 在枚举每一条路
输出3部分
打印路径
如果用了第二种类型的边 输出边的起点 没用输出Ticket Not Used
最短路
#include <cstring> #include <cstdio> #include <vector> #include <queue> using namespace std; const int maxn = 10510; const int INF = 999999999; struct HeapNode { int d, u; bool operator < (const HeapNode& rhs) const { return d > rhs.d; } }; struct Edge { int from, to, dist; }; vector <Edge> edges; vector <Edge> edge2; vector <int> G[maxn]; bool done[maxn]; int p[2][maxn]; int d[2][maxn]; int n, s, e, m, k; void AddEdge(int from, int to, int dist) { edges.push_back((Edge){from, to, dist}); edges.push_back((Edge){to, from, dist}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void AddEdge2(int from, int to, int dist) { edge2.push_back((Edge){from, to, dist}); edge2.push_back((Edge){to, from, dist}); } void Dijkstra(int start, int num) { priority_queue <HeapNode> Q; for(int i = 1; i <= n; i++) d[num][i] = INF; d[num][start] = 0; memset(done, 0, sizeof(done)); Q.push((HeapNode){0, start}); while(!Q.empty()) { HeapNode x = Q.top();Q.pop(); int u = x.u; if(done[u]) continue; done[u] = true; //printf("%d\n", u); for(int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if(d[num][e.to] > d[num][u] + e.dist) { d[num][e.to] = d[num][u] + e.dist; p[num][e.to] = G[u][i]; Q.push((HeapNode){d[num][e.to], e.to}); } } } } int main() { int cas = 0; while(scanf("%d %d %d", &n, &s, &e) != EOF) { if(cas++) puts(""); edges.clear(); edge2.clear(); for(int i = 1; i <= n; i++) G[i].clear(); scanf("%d", &k); for(int i = 1; i <= k; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); AddEdge(u, v, w); } scanf("%d", &k); for(int i = 1; i <= k; i++) { int u, v, w; scanf("%d %d %d", &u, &v, &w); AddEdge2(u, v, w); } Dijkstra(s, 0); Dijkstra(e, 1); int ans = d[0][e]; int flag = 0; int from; int to; for(int i = 0; i < edge2.size(); i++) { int temp = d[0][edge2[i].from] + d[1][edge2[i].to] + edge2[i].dist; //printf("%d %d\n", d[1][3], d[0][1]); if(ans > temp) { flag = 1; from = edge2[i].from; to = edge2[i].to; ans = temp; } } int res1[10000]; int res2[10000]; int res3[10000]; if(flag) { int pos = from, i = 0; while(pos != s) { res1[i++] = edges[p[0][pos]].from; pos = edges[p[0][pos]].from; } int z = 0; for(int j = i-1; j >= 0; j--) res3[z++] = res1[j]; res3[z++] = from; res3[z++] = to; pos = to, i = 0; while(pos != e) { res2[i++] = edges[p[1][pos]].from; pos = edges[p[1][pos]].from; } for(int j = 0; j < i; j++) res3[z++] = res2[j]; for(i = 0; i < z; i++) { if(i) printf(" "); printf("%d", res3[i]); } puts(""); } else { int pos = e, i = 0; while(pos != s) { res1[i++] = edges[p[0][pos]].from; pos = edges[p[0][pos]].from; } for(int j = i-1; j >= 0; j--) printf("%d ", res1[j]); printf("%d\n", e); } if(flag) printf("%d\n", from); else puts("Ticket Not Used"); printf("%d\n", ans); } return 0; } /* 3 1 3 1 1 2 10 1 2 3 100 */
UVa 11374 Airport Express / Dijkstra,布布扣,bubuko.com
UVa 11374 Airport Express / Dijkstra
原文:http://blog.csdn.net/u011686226/article/details/19993593