循环n次,每次用离源点最近的点去更新源点到其他点的距离。
#include<iostream>
#include<cstring>
using namespace std;
const int N = 510;
int dist[N];
int d[N][N];
int st[N];
int n, m;
int dijkstra(){
dist[1] = 0;
for(int i = 0; i < n; i ++){
int k = 0;
for(int j = 1; j <= n; j ++)
if(st[j] == 0 && dist[j] < dist[k])
k = j;
st[k] = 1;
for(int j = 1; j <= n; j ++)
dist[j] = min(dist[j], dist[k] + d[k][j]);
}
if(dist[n] == 0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
memset(dist, 0x3f, sizeof dist);
memset(d, 0x3f, sizeof d);
cin >> n >> m;
for(int i = 1; i <= n; i ++) d[i][i] = 0;
while(m --){
int x, y, z;
cin >> x >> y >> z;
d[x][y] = min(d[x][y], z);
}
cout << dijkstra() << endl;
return 0;
}