其实还可以用其他的最短路算法,这里拿SPFA练练手
#pragma GCC optimize("inline")
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node{
int to,w,nxt;
}edge[20005];
int head[120];
int cnt;
int book[120];
deque<int>dq;
int n,m;
inline void addedge(int u,int v,int cost) {
edge[cnt].to = v;
edge[cnt].w = cost;
edge[cnt].nxt = head[u];
head[u] = cnt++;
}
inline int spfa(int x) {
register int dis[120],sum = 0;
memset(dis,0x3f,sizeof(dis));
book[x] = 1;
dq.push_back(x);
dis[x] = 0;
register int num = 1;
while(!dq.empty()) {
x = dq.front();
dq.pop_front();
if(num*dis[x]>sum) {
dq.push_back(x);
continue;
}
sum -= dis[x];
num--;
book[x] = 0;
for(register int i=head[x];i!=-1;i = edge[i].nxt) {
//cout<<edge[i].to<<endl;
//cout<<edge[i].to<<endl;
if(dis[edge[i].to]>dis[x] + edge[i].w) {
dis[edge[i].to] = dis[x] + edge[i].w;
if(!book[edge[i].to]) {
num++;
book[edge[i].to] = 1;
sum += dis[edge[i].to];
if(!dq.empty()&&dis[edge[i].to]>dis[dq.front()])
dq.push_back(edge[i].to);
else
dq.push_front(edge[i].to);
//cout<<num<<endl;
}
}
}
}
return dis[n];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin>>n>>m) {
if(!n&&!m)break;
cnt = 0;
memset(head,-1,sizeof(head));
memset(book,0,sizeof(book));
int a,b,c;
for(register int i=0;i<m;i++) {
cin>>a>>b>>c;
addedge(a,b,c);
addedge(b,a,c);
}
cout<<spfa(1)<<endl;
}
}