#include<bits/stdc++.h>
using namespace std;
int a[1001][1001],n,m,s,dis[1001],vis[1001];
void dijkstra(){
//初始化最短路径为无穷远
memset(dis,0x3f,sizeof(dis));
//初始起点距离
dis[s]=0;
for(int i=1;i<=n;i++){ //一共会加入n个点
//找未被标记中最小距离的点
int minn=2147483647;
int u;//记录距离最小的点的标号
for(int j=1;j<=n;j++){ //遍历所有的点
if(vis[j]==0 && dis[j]<minn){
minn=dis[j];
u=j;
}
}
//加入到标记中
vis[u]=1;
//更新以u作为起点的点的距离
for(int j=1;j<=n;j++){
if(vis[j]==0 && dis[j]>dis[u]+a[u][j]){
dis[j]=dis[u]+a[u][j];
}
}
}
}
int main(){
cin>>n>>m>>s;
memset(a,0x3f,sizeof(a));
for(int i=1;i<=n;i++){
a[i][i]=0;
}
for(int i=1;i<=m;i++){
int p,q,t;
cin>>p>>q>>t;
a[p][q]=t;
}
dijkstra();
for(int i=1;i<=n;i++){
cout<<dis[i]<<" ";
}
return 0;
}
C++ Dijkstra算法
最新推荐文章于 2025-03-05 16:38:56 发布