uva 10986 Sending email
"A new internet watchdog is creating a stir in
Springfield. Mr. X, if that is his real name, has
come up with a sensational scoop."Kent Brockman
There are n SMTP servers connected by network cables. Each of the
m cables connects two computers and has a certain latency measured in milliseconds required to send an email message. What is the shortest time required to send a message from server
S to server T along a sequence of cables? Assume that there is no delay incurred at any of the servers.
Input
The first line of input gives the number of cases, N. N test cases follow. Each one starts with a line containing
n (2<=n<20000), m (0<=m<50000),
S (0<=S<n) and T (0<=T<n).
S!=T. The next m lines will each contain 3 integers: 2 different servers (in the range [0,
n-1]) that are connected by a bidirectional cable and the latency,
w, along this cable (0<=w<=10000).
Output
For each test case, output the line "Case #x:" followed by the number of milliseconds required to send a message from
S to T. Print "unreachable" if there is no route from
S to T.
Sample Input | Sample Output |
3 2 1 0 1 0 1 100 3 3 2 0 0 1 100 0 2 200 1 2 50 2 0 0 1 |
Case #1: 100 Case #2: 150 Case #3: unreachable |
题目大意:第一行四个数据:点的数量n,边的数量m,起点s, 终点f。接下来是m行的边的数据:端点u,端点v,权值val。求s, 到f的最短路径。
解题思路:用floyd或者普通的dijstra会超时,因为点的数量比较多(20000),所以要用vector-邻接表实现dijkstra。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std; typedef long long ll; const int INF = 1000005; const int N = 20005; int n, m, beg, fin; int d[N], vis[N]; struct Node { int d, u; bool operator < (const Node& rhs) const { return d > rhs.d; } }; struct Edge { int from, to, dist; }; vector<Edge> Edges; vector<int> G[N]; void init() { memset(vis, 0, sizeof(vis)); 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}); int pos = Edges.size(); G[from].push_back(pos - 1); } void dijkstra() { for (int i = 0; i < n; i++) d[i] = INF; d[beg] = 0; priority_queue<Node> Q; Q.push((Node){0, beg}); while (!Q.empty()) { Node x = Q.top(); Q.pop(); int u = x.u; if (vis[u]) continue; vis[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; Q.push((Node){d[e.to], e.to}); } } } } int main() { int T, Case = 1; scanf("%d", &T); while (T--) { init(); printf("Case #%d: ", Case++); scanf("%d %d %d %d", &n, &m, &beg, &fin); for (int i = 0; i < m; i++) { int u, v, val; scanf("%d %d %d", &u, &v, &val); AddEdge(u, v, val); AddEdge(v, u, val); } if (beg > fin) { int temp = beg; beg = fin; fin = temp; } dijkstra(); if (d[fin] == INF || d[fin] == 0) { printf("unreachable\n"); } else { printf("%d\n", d[fin]); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。