uva 10986 Sending email (dijkstra)

来源:互联网 发布:家有大猫 知乎 编辑:程序博客网 时间:2024/05/21 09:30

                                   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 them 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 serverS 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 containingn (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 fromS to T. Print "unreachable" if there is no route fromS to T.

Sample InputSample Output
32 1 0 10 1 1003 3 2 00 1 1000 2 2001 2 502 0 0 1
Case #1: 100Case #2: 150Case #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;}


0 0