Dijkstra 的整体思路比较清晰
即进行n(n为n的个数)次迭代去确定每个点到起点的最小值 最后输出的终点的即为我们要找的最短路的距离
所以按照这个思路除了存储图外我们还需要存储两个量
dist[n] //用于存储每个点到起点的最短距离
st[n] //用于在更新最短距离时 判断当前的点的最短距离是否确定 是否需要更新
#include <bits/stdc++.h>
using namespace std;
const int N=510;
int n,m;
int g[N][N];//稠密图用邻接矩阵存储
int dist[N];//dist[i] 表示源点到节点 i 的距离
bool st[N];//每个点的最短路径是否确定
int dijkstra(){
memset(dist, 0x3f,sizeof dist);//初始化距离均为正无穷
dist[1]=0;
//迭代n次
for(int i=0;i<n;i++){
int t=-1;//初始化
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[t]>dist[j])) t=j;//寻找剩余未确定最短路的点中路径最短的点
}
st[t]=true;//标记该点
for(int j=1;j<=n;j++){
dist[j]=min(dist[j],dist[t]+g[t][j]);//在该点的基础上更新,初始化的距离是正无穷,每次会选择更小的距离
}
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
scanf("%d%d",&n,&m);
memset(g,0x3f,sizeof g);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=min(g[a][b],c);//消除重边
}
int t=dijkstra();
printf("%d\n",t);
return 0;
}