用优先队列解决最短路问题,会将复杂度降低
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define inf 999999
using namespace std;
struct pp{
int pos;
int cost;
pp(){}
pp(int xx, int yy):pos(xx), cost(yy){}
bool operator < (const pp &a) const{
return cost > a.cost;
}
};
struct qq{
int to;
int val;
qq(){}
qq(int xx, int yy):to(xx), val(yy){}
};
priority_queue<pp>mm;
vector<qq>edge[1100];
int n, m, d[1010];
bool vis[1010];
int main(){
int i;
while(scanf("%d%d", &m, &n)!=EOF){
for(i = 1; i <= n; i++)
edge[i].clear();
while(!mm.empty()){
mm.pop();
}
memset(vis, 0, sizeof(vis));
for(i = 1; i <= n; i++)
d[i] = inf;
int a, b, c;
for(i = 1; i <= m; i++){
scanf("%d%d%d", &a, &b, &c);
edge[a].push_back(qq(b, c));
edge[b].push_back(qq(a, c));
}
d[1] = 0;
mm.push(pp(1, 0));
while(!mm.empty()){
pp node = mm.top();
mm.pop();
if(!vis[node.pos]){
for(i = 0; i < edge[node.pos].size(); i++){
if(d[edge[node.pos][i].to] > d[node.pos] + edge[node.pos][i].val){
d[edge[node.pos][i].to] = d[node.pos] + edge[node.pos][i].val;
mm.push(pp(edge[node.pos][i].to, d[edge[node.pos][i].to]));
}
}
vis[node.pos] = 1;
}
}
printf("%d\n", d[n]);
}
return 0;
}