#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int mx= INT_MAX;
const int maxn= 10000;
int vis[maxn]; //记录已经找到最短路径的点
int d[maxn]; //到原点的距离
int pr[maxn][maxn]; //邻接表
int n,m;
int k;
int main(){
memset(vis,0,sizeof vis);
cin>>n>>m;
for(int i = 0;i <= n;i++ ){
for(int j = 0;j <=n;j++)
pr[i][j]=mx; //初始化数组pr 和 d
d[i] = mx;
}
for(int i = 1;i <= m;i++){
int u,v,w;
cin>>u>>v>>w;
pr[u][v]=w; //输入点 和点的权值 并加入到邻接矩阵pr中
}
for(int i = 2;i <= n;i++)
d[i]=pr[1][i]; //更新与原点1相邻的距离
vis[1]=1; //标记原点
int minx;
for(int i = 2;i <= n;i++){ //在记录的数组 d中寻找最小值 并记为k
minx = mx;
for(int j = 2;j <= n;j++){
if(d[j]<minx&&!vis[j]){
minx = d[j];
k=j;
}
}
vis[k]=1; //标记已经找到k的最短路径
for(int j = 2;j <= n;j++){ //确定其他与k相邻 并且没有被访问的点到原点的距离是否需要更新
if(d[j]>pr[k][j]+d[k] && !vis[j])
d[j]=pr[k][j]+d[k]; //更新
}
}
for(int i = 2;i <= n;i++) //输出
cout<<d[i]<<" ";
cout<<endl;
return 0;
}
Dijkstra算法
最新推荐文章于 2024-01-21 23:48:44 发布