#include<bits/stdc++.h>
#define maxn 100
#define INF 0x3f3f3f//无穷大
using namespace std;
int g[maxn][maxn],dist[maxn],path[maxn],vis[maxn];//邻接矩阵,距离,路径,标记;
int m,n;//顶点数,边数;
void Dij(int v){
vis[v]=1;path[v]=0;//初始化数组
for(int i=1;i<=m;i++){
dist[i]=g[v][i];
if(dist[i]!=INF){
path[i]=v;
}
}
for(int j=0;j<m-1;j++){//m-1趟
int mindis=INF,minv=0;//距离源点距离最小的点,及其距离
for(int k=1;k<=m;k++){
if(dist[k]<mindis&&!vis[k]){
mindis=dist[k];
minv=k;
}
}
vis[minv]=1;
for(int k=1;k<=m;k++){
if(dist[minv]+g[minv][k]<dist[k]&&!vis[k]){
dist[k]=dist[minv]+g[minv][k];
path[k]=minv;
}
}
}
}
int main()
{
cin>>m>>n;
fill(g[0],g[0]+maxn*maxn,INF);
for(int i=0;i<n;i++)
{
int v1,v2,weight;
cin>>v1>>v2>>weight;
g[v1][v2]=weight;
}
Dij(1);
for(int i=1;i<=m;i++){
cout<<dist[i]<<" ";
}
cout<<endl;
return 0;
}
迪杰斯特拉算法-Dijsktra
最新推荐文章于 2024-08-19 12:02:02 发布