uva 10986 Sending email (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;
}

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

时间: 2024-10-10 22:20:24

uva 10986 Sending email (dijkstra)的相关文章

UVA 10986 Sending email 【dijkstra + 堆优化】

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1927 题意:n个点m条边,求s到e的最短距离 代码: #include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> #include<cty

UVA 10986 Sending email(SPFA)

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

UVA 10986 Sending email 最短路问题

基本的最短路问题 就是数据需要稍微处理一下.(N比较大)dijkstra也要优化.不优化应该会T: #include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #i

UVa 10986 - Sending email

链接:http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1927 //邻接表+队列 #include <iostream> #include <string.h> #include <queue> #include <stdio.h> using namespac

uva 11374 Airport Express (Dijkstra)

 题意:在Iokh市中,机场快线是市民从市内去机场的首选交通工具.机场快线分为经济线和商业线两种,线路,速度和价钱都不同.你有一张商业线车票,可以做一站商业线,而其他时候只能乘坐经济线.假设换乘时间忽略不计,你的任务是找一条去机场最快的路线.. 分析:枚举商业线T(a,b),则总时间为f(a)+T(a,b)+g(b);f和g用两次dijkstra来计算,以S为起点的dijkstra和以E为起点的dijkstra: 注意:有可能只做慢车到达不了终点,这时必须做某站快车,如果按照坐慢车一定能到达

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

hdu 1874(Dijkstra )

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692    Accepted Submission(s): 10019 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路

UVA 618 - Doing Windows(数论)

题目链接:618 - Doing Windows 题意:给定一个大小不能变的屏幕,和四个大小可以变的窗口,变化要保持长宽比,问这四个窗口能不能调整后全部放下正好填满屏幕,不能重叠 思路:情况一共就几种:4个叠一起,3个叠一起+一个,2个和2个,一个和两个叠一起在一个,把这几种情况全判断了就可以了,判断过程利用gcd,lcm可以求边长. 代码: #include <stdio.h> #include <string.h> long long gcd(long long a, long

Uva 10404-Bachet&#39;s Game(博弈)

题目链接:点击打开链接 在DP专题里刷到的,看着像博弈就水过去了.. 题意:n件物品,两个人轮流取,每次取的数量必须为一个集合s(集合里肯定含有1)里的一个数字,最后不能取者输(即取走最后一件物品者胜). 思路:递推.设 w[i] 为有i件物品时的状态,w[i]=1代表先手必胜,w[i]=0代表先手必败.可以知道w[1]=1,递推生成所有状态. 可以知道对于一个状态,如果他的后继存在必败状态,则该状态为必胜状态:如果该状态的所有后继都为必胜状态,那么该状态为必败状态. #include <alg