知识储备:
vector实现邻接表 优先队列优化的dijkstra
优先队列对于pair的排序实现原理是:先比较first 相同的话在比较second。
#include <queue>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int n,m;
int dis[110],vis[110];
typedef pair <int, int> pii;
vector <pii> v[110];
void dijkstra(){
for(int i=0; i<=n; i++){
dis[i] = INF;
vis[i] = 0;
}
dis[1] = 0, vis[0] = 1;
priority_queue <pii, vector<pii>, greater<pii> > q;
q.push(make_pair(dis[1], 1));
while(!q.empty()){
pii k = q.top();
q.pop();
int from = k.second;
for(int i=0; i<v[from].size(); i++){
int to = v[from][i].first,cost = v[from][i].second;
if(dis[to] > dis[from] + cost){
dis[to] = dis[from] + cost;
if(!vis[to])
q.push(make_pair(dis[to], to));
}
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d",&n,&m) != EOF){
if(!n && !m) break;
else{
for(int i=1; i<=n; i++) v[i].clear();
for(int i=0; i<m; i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
dijkstra();
}
printf("%d\n",dis[n]);
}
return 0;
}