HDU 2544 最短路
Posted wudongwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2544 最短路相关的知识,希望对你有一定的参考价值。
题目描述
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
题目分析
最短路问题。用的是Dijkstra算法,当时还没看过SPFA算法。不过能用就行。
DijKstra算法的大概意思就是用一个集合来存储单源点到其余个点的最短距离。去找距离这个集合最短距离的点,不断更新这个集合,直到这个集合吞并整个图。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXV 105
#define INF 0x3f3f3f
int cost[MAXV][MAXV];
int d[MAXV]; //从集合出发的到x顶点的最小值
bool used[MAXV];
int V, E;
int Min(int a, int b) {
return a < b ? a : b;
}
void dijkstra(int s) {
for (int i = 1; i <= V; i++) {
d[i] = cost[1][i];
used[i] = false;
}
d[s] = 0;
while (true) {
int v = -1;
//找到权值最小的顶点
for (int u = 1; u <= V; u++) {
if (!used[u] && (v == -1 || d[u] < d[v])) {
v = u;
}
}
if (v == -1) break;
used[v] = true;
//更新插入新节点v后集合X到那些顶点的距离。
for (int u = 1; u <= V; u++) {
d[u] = Min(d[u], d[v] + cost[v][u]);
}
}
}
int main() {
while(scanf("%d%d", &V, &E)) {
if (!V && !E) break;
for (int i = 1; i <= V; i++)
for (int j = 1; j <= i; j++) {
if (i == j) cost[i][j] = 0;
else cost[i][j] = cost[j][i] = INF;
}
int u, v, val;
for (int i = 0; i < E; i++) {
scanf("%d%d%d", &u, &v, &val);
cost[u][v] = cost[v][u] = val;
}
dijkstra(1);
printf("%d
", d[V]);
}
return 0;
}
以上是关于HDU 2544 最短路的主要内容,如果未能解决你的问题,请参考以下文章