思路 : 裸的最短路 没有负权 所以考虑Dij
ACcode:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<functional>
#include<string>
#include<utility>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
using namespace std;
#define INF 1e9+7
#define N 110
struct node
{
int ed, len;
node(int a = 0, int b = 0)
{
ed = a;
len = b;
} friend bool operator < (node a, node b) // len小的优先
{
if (a.len == b.len)
return a.ed < b.ed;
else
return a.len > b.len;
}
};
vector<node> G[N];
int dis[N], n;
void Dijkstra(int st)
{
int i;
for (i = 0; i <= n; i++)
dis[i] = INF;
dis[st] = 0;
priority_queue<node> q;
q.push(node(st, dis[st]));
while (!q.empty())
{
node now = q.top();
q.pop();
for (i = 0; i<G[now.ed].size(); i++) //遍历每条邻边
{
node next = G[now.ed][i];
if (dis[next.ed]>now.len + next.len)
{
dis[next.ed] = now.len + next.len;
q.push(node(next.ed, dis[next.ed]));
}
}
}
}
int main()
{
int st, ed, len, m;
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == 0 && m == 0)
break;
for (int i = 0; i <= n; i++)
G[i].clear();
while (m--)
{
scanf("%d%d%d", &st, &ed, &len);
G[st].push_back(node(ed, len));
G[ed].push_back(node(st, len));
}
Dijkstra(1);
printf("%d\n", dis[n]);
}
return 0;
}