#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXV=1000;
const int INF=100000000;
int n,m,s,G[MAXV][MAXV];
int d[MAXV];//起点到达各点的最短路径长度
bool vis[MAXV]={false};
void Dijkstra(int s){
fill(d,d+MAXV,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1) return;
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
}
}
}
}
int main(){
int u,v,w;
cin>>n>>m>>s;
fill(G[0],G[0]+MAXV*MAXV,INF);
for(int i=0;i<m;i++){
cin>>u>>v>>w;
G[u][v]=w;
}
Dijkstra(s);
for(int i=0;i<n;i++){
cout<<d[i]<<" ";
}
return 0;
}
测试:
6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
代码解释:
void d(){
//初始化图
//将出发点到出发点的距离设为0
for(循环n次){//n表示顶点数
//设当前欲访问的顶点下标为u=-1;
//设所有点中到起点距离最短的那个点的路径长为MAX=100000000000;
for(循环n次){
if(第n个点没有被访问&&该点到起点的路径最短){
MAX=最短路径;
u=n;//记录该点,即该点已经被访问
}
}
if(u==-1) return;//所有点已经被访问,函数结束
//标记u点被访问
for(n次循环){
if(该点没有被访问&&该点到新被访问顶点u的距离小于原来路径){
//更新路径
}
}
}
}
视频解释:https://www.bilibili.com/video/av38254646/?redirectFrom=h5
时间复杂度=n*(n+n)
关于该算法的题目和思想后续还会更新
原文:https://www.cnblogs.com/tao7/p/10237406.html