Dijkstra(迪杰特斯拉) 算法 图论 最短路径

【经典算法】最短路径算法——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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值