题目链接:HDU 2544
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 11111;
const int inf = (int)1e9;
struct Edge
{
int v, next; // v 边所指向的节点 next 边所指向的节点的指针
int cost; // 权值
Edge() {}
Edge(int a, int b) { v = a, cost = b; }
bool operator<(const Edge & x)const {
return cost > x.cost;
}
} edge[maxn];
int eh[maxn], tot, dist[maxn]; // eh[i] 指针数组,存放节点i所指向的节点的指针 tot为边数组的下标
int n;
bool vist[maxn];
void addedge(int a, int b, int c) // 添加从a指向b的边,权值为c
{
edge[tot].v = b, edge[tot].next = eh[a], edge[tot].cost = c;
eh[a] = tot++;
}
void dij(int s) // 以s为起点求最短路
{
for (int i = 0; i <= n; i++) dist[i] = inf, vist[i] = false;
dist[s] = 0;
priority_queue< Edge > que;
que.push(Edge(s, 0));
while (!que.empty()) {
int u = que.top().v;
que.pop();
if (vist[u]) continue;
vist[u] = true;
for (int j = eh[u]; j != -1; j = edge[j].next) {
int v = edge[j].v;
if (!vist[v] && dist[u] + edge[j].cost < dist[v]) {
dist[v] = dist[u] + edge[j].cost;
que.push(Edge(v, dist[v]));
}
}
}
}
void init() // 初始化
{
tot = 0;
memset(eh, -1, sizeof (eh));
}
int main()
{
freopen("in", "r", stdin);
int m, a, b, c;
while(scanf("%d%d", &n, &m), n||m) {
init();
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &a, &b, &c);
addedge(a, b, c);
addedge(b, a, c);
}
dij(1);
printf("%d\n", dist[n]);
}
return 0;
}