日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Uva 11374 - Airport Express(枚举+最短路)

發布時間:2024/3/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Uva 11374 - Airport Express(枚举+最短路) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接 https://vjudge.net/problem/UVA-11374

【題意】
市民從市區去機場要走機場快線,機場快線分為經濟線和商業線兩種,你只有一張商業線車票,只能坐一站商業線,其它時候只能坐經濟線,忽略換乘時間,找到一條去機場最快的線路。

【思路】
大白書329頁例題,可以先按照經濟線建立無向圖,用dijkstra算法分別求出以起點和以終點為源點的最短路,然后依次枚舉每種經濟線,看看能不能更省時間,如果能就保留這種方案,具體細節看代碼

#include<bits/stdc++.h> using namespace std;const int inf = 0x3f3f3f3f; const int maxn = 550; const int maxk = 1050;struct Edge {int from, to, dist;Edge(int f, int t, int d) :from(f), to(t), dist(d) {} };struct HeapNode {int d, u;HeapNode(int dd, int uu) :d(dd), u(uu) {};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 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 add(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> que;for (int i = 0; i < n; ++i) d[i] = inf;d[s] = 0;memset(done, 0, sizeof(done));que.push(HeapNode(0, s));while (!que.empty()) {HeapNode x = que.top();que.pop();int u = x.u;if (done[u]) continue;done[u] = true;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];que.push(HeapNode(d[e.to], e.to));}}}} };int n, m, k, s, t; int d1[maxn], d2[maxn]; int p1[maxn], p2[maxn]; Dijkstra di;void print1(int x) {//針對起點if (x == s) {printf("%d", 1 + s);return;}Edge& e = di.edges[p1[x]];print1(e.from);printf(" %d", 1 + x); }void print2(int x) {//針對終點if (x == t) {printf(" %d\n", 1 + t);return;}printf(" %d", 1 + x);Edge& e = di.edges[p2[x]];print2(e.from); }int main() {int flag = 0;while (scanf("%d%d%d", &n, &s, &t) == 3) {--s, --t;if (flag) putchar('\n');flag = 1;di.init(n);scanf("%d", &m);for (int i = 0; i < m; ++i) {int u, v, c;scanf("%d%d%d", &u, &v, &c);--u, --v;di.add(u, v, c);di.add(v, u, c);}di.dijkstra(s);memcpy(d1, di.d, sizeof(d1));memcpy(p1, di.p, sizeof(p1));di.dijkstra(t);memcpy(d2, di.d, sizeof(d2));memcpy(p2, di.p, sizeof(p2));int ans = d1[t], sto = -1, tto = -1;scanf("%d", &k);for (int i = 0; i < k; ++i) {int u, v, c;scanf("%d%d%d", &u, &v, &c);--u, --v;if (d1[u] + c + d2[v] < ans) {ans = d1[u] + c + d2[v];sto = u;tto = v;}if (d1[v] + c + d2[u] < ans) {ans = d1[v] + c + d2[u];sto = v;tto = u;}}if (-1 == sto) {print1(t);printf("\n");printf("Ticket Not Used\n");}else {print1(sto);print2(tto);printf("%d\n", sto + 1);}printf("%d\n", ans);}return 0; }

總結

以上是生活随笔為你收集整理的Uva 11374 - Airport Express(枚举+最短路)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。