Dijkstra求最短路

Posted Rgylin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra求最短路相关的知识,希望对你有一定的参考价值。

思想

比如求一点到图中所有点的距离最短路径
步骤

  • 选择一点比如从一开始,一开始初始化路径dist[i]为无穷大,初始化从1点到大其他点的最短路径
  • 设置一个标记数组记录已经纳入最短距离的集合中,从未被标记的点中选择到达它距离最短的点,并标记,防止重复选取
  • 用选出的点来更新到达其他点的最短距离 取min操作
  • 一开始已经选了一个初始化的点 所以再选取n-1个即可 所以重复n-1次 选的过程

以一道题目为例

https://www.acwing.com/activity/content/problem/content/918/

代码如下

#include <cstring>
#include <iostream>
using namespace std;

const int N = 506;
const int Maxn= 10005;
int dist[N] ; //最短路距离
int g[N][N] ; 
bool st[N];
int n,m;
int res;
int digistr()
    for(int i=1;i<=n;i++)dist[i]=Maxn;
    dist[1]=0; //从1开始遍历
    //初始化 点i到 其他点的距离
    for(int i=2;i<=n;i++)
        if( g[1][i]!= Maxn)
            dist[i] = g[1][i];
        
    
    int t=0;
    for(int i=0;i<n-1;i++)//迭代n-1次
        int mins = Maxn;
        for(int j=1;j<=n;j++)
            if(!st[j] &&  mins > dist[j])
                t= j;
                mins= dist[j];
            
        
        st[t] = true;
        for(int j=1;j<=n ;j++)
            dist[j] =min(dist[j],dist[t]+g[t][j]);
        
        
    
    if(dist[n] ==Maxn ) return -1;
    else return dist[n];

    

int main()
    int a,b,c;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            g[i][j] =Maxn;
    while (m --)
        cin>>a>>b>>c;
        g[a][b]= min(g[a][b],c); //因为有多条边所以取最小值
    
    res= digistr();
    cout<<res<<endl;
    
    return 0;

以上是关于Dijkstra求最短路的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra求最短路

Dijkstra

最短路径算法(Dijkstra)

用Dijkstra算法求最短路径

用C++求dijkstra算法求最短路径

用Dijkstra算法求最短路径的MATLAB程序