这里其中对于t那里总有些想不明白,这这篇记录一下
式子中的t我们按从第一个点到最后一个点一次遍历而t则就代表着其中的每一个点,
for(int j = 1;j<=n;j++) if(!s[j]&&(t==-1||dis[t]>dis[j]))t=j;s[t]=true;
而上述这段是什么个操作呢? 如果遍历到的j的还没有获取最短路径值(也就是无穷大或者原点,)然后让t=j也就是
点的定位,定位之后,标记s[t]=true;之后不再对此点重复标记//之后的思路就是标记点到其余点距离取最小值。(那么这里是否能反过来呢, 遍历其他点到标记点的距离。路径取最小值呢?)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n ,m;
const int N = 510;
int dis[N];
int g[N][N];
bool s[N];
int dijkstra(){
//然后到核心算法迪杰斯特拉的核心是什么呢
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for(int i =0;i<n;i++){
int t = -1;
for(int j = 1;j<=n;j++) if(!s[j]&&(t==-1||dis[t]>dis[j]))t=j;s[t]=true;
//依次遍历
for(int j =1;j<=n;j++)dis[j]=min(dis[j],dis[t]+g[t][j]);
}
if(dis[n]==0x3f3f3f3f)return -1;
return dis[n];
}
int main(){
cin>>n>>m;
memset(g,0x3f,sizeof g);
while(m--){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);
}
cout<<dijkstra()<<endl;
return 0;
}