【经典算法】最短路径算法——Dijkstra_dijkstra算法-CSDN博客
【图-最短路径-Dijkstra(迪杰斯特拉)算法】https://www.bilibili.com/video/BV1uT4y1p7Jy?vd_source=47ea6e11f644e8fae50997c63140dd52
1.算法理论层面参考上方引用第一个链接,特别是其中的有关Dijkstra的松弛操作
2.可视化模拟,非代码解题流程参考上方第二个链接,注意体会松弛操作
3.单源最短路径算法,Dijkstra(迪杰特斯拉)算法只能算出一个指定点(源点)到其余点最短路径
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main(){
int n,e,start;
cin>>n;//结点数量
vector<vector<int>> graph(n,vector<int>(n,-1));//默认值为-1代表边不存在
//边的数量
cin>>e;
int u,v,w;
while(e--){
cin>>u>>v>>w;
graph[u][v] = w;
}
vector<bool> vis(n,false);//初始化false,表示所有结点都未被访问
vector<int> dist(n,INT_MAX);//初始化 源点(此代码中为结点0) 到 所有点(含结点0)距离 都为INT_MAX
start = 0;//源点为1
dist[start] = 0;//源点到结点0距离为0
for(int i = 0;i < n-1;i++){//源点到其余点 植树问题 n-1次迭代
int u = -1;//找新的点,-1表示未找到,初始化-1 便于找后判断是否找到
int minDist = INT_MAX;
for(int j = 0;j < n;j++){
if(!vis[j] && dist[j] < minDist){
minDist = dist[j];
u = j;
}
}//当前未被访问结点 dist最短 将被连接,表示该结点 j 到 源点 最短距离dist[j],此后不再改变
if(u==-1) break;
vis[u] = true;//此后 不再改变 源点和结点u之间的最短距离
for(int v = 0;v < n;v++){//确立了u后,更新经过u结点的其余结点更短路径
if(!vis[v] && graph[u][v] != -1 && dist[v] > dist[u] + graph[u][v]){
dist[v] = dist[u] + graph[u][v];
}
}
}
int end = n - 1;//默认终点为n-1
if(dist[end] != INT_MAX)
cout << dist[end] << '\n';
else cout << -1 << '\n';//表示无法达到终点
}
输入:
5
10
0 1 10
0 4 5
1 2 1
1 4 2
2 3 4
3 0 7
3 2 6
4 1 3
4 2 9
4 3 2
输出:
5

1099

被折叠的 条评论
为什么被折叠?



