码迷,mamicode.com
首页 > 其他好文 > 详细

uva 10986 Sending email (dijkstra)

时间:2015-07-14 11:35:44      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:acm   uva   dijkstra   算法   

                                   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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 10986 Sending email (dijkstra)

标签:acm   uva   dijkstra   算法   

原文地址:http://blog.csdn.net/llx523113241/article/details/46874015

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!