g
是邻接矩阵,
st
是标记数组,标记是否已经为最优
d
是距离数组,d【i】
表示点1
到点i
的最短距离为d【i】
讲解视频-------------->【【算法】最短路径查找—Dijkstra算法】 【精准空降到 00:00】
#include<iostream>
#include<cstring>
#define N 586
using namespace std;
int n,m;
int d[N];
int g[N][N],st[N];
void dj(){
d[1]=0;
for(int i=0;i<n-1;++i){
int t=-1;
for(int j=1;j<=n;++j){
if(!st[j]&&(t==-1||d[j]<d[t]))// t==-1是当刚开始时,要初始化t=j
t=j;//然后每次挑未被确定为最短距离的点里面的距离最小的点
}
//遍历所有的点,看是否存在点t到点j的距离比原来点1到点j的点更近,
for(int j=1;j<=n;++j){
d[j]=min(d[j],d[t]+g[t][j]);
}
st[t]=1;
}
if(d[n]==0x3f3f3f3f){
cout<<-1<<endl;
return;
}
cout<<d[n]<<endl;
}
int main(){
memset(g,0x3f,sizeof g);
memset(d,0x3f,sizeof d);
cin>>n>>m;
for(int i=1;i<=m;++i){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);//因为存在重边or自环
//比如 x=2,y=3,z=3
//x=2,y=3,z=2.第一次g【2】【3】==3,第二次g【x】【y】则需要更新为2!
}
dj();
return 0;
}