// UVa 10986 - Sending email // Dijkstra #include <iostream> #include <vector> #include <string.h> #include <stdio.h> #include <queue> using namespace std; #define MaxN 20000 #define integer unsigned long long int struct edge { int b;integer c; }; struct dsol { bool reachable;integer cost; }; bool operator <(edge x, edge y) { return x.c > y.c || (x.c == y.c && x.b > y.b); } int n, s, t; vector<edge> lnk[MaxN]; dsol dijkstra() { priority_queue<edge> q; integer dist[MaxN]; memset(dist, 127, sizeof(dist)); bool yet[MaxN]; memset(yet, true, sizeof(yet)); integer oo = dist[0]; int i = s; dist[s] = 0; while (i != -1 && i != t) { yet[i] = false; for (int j = 0; j < lnk[i].size(); j++) { int b = lnk[i][j].b; integer c = lnk[i][j].c; if (yet[b] && (dist[b] == oo || dist[i] + c < dist[b])) { dist[b] = dist[i] + c; q.push( { b, dist[b] }); } } while (!q.empty() && !yet[q.top().b]) q.pop(); i = (q.empty() ? -1 : q.top().b); } return {dist[t] != oo, dist[t]}; } int main() { int ttt; cin >> ttt; for (int tt = 1; tt <= ttt; tt++) { int m; cin >> n >> m >> s >> t; for (int i = 0; i < n; i++) lnk[i].clear(); for (int j = 0; j < m; j++) { int a, b; integer c; cin >> a >> b >> c; lnk[a].push_back( { b, c }); lnk[b].push_back( { a, c }); } dsol sol = dijkstra(); if (!sol.reachable) printf("Case #%d: unreachable\n", tt); else { printf("Case #%d: ", tt); cout << sol.cost << endl; } } return 0; }
Wednesday, November 4, 2015
UVa 10986 - Sending email
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment