单源最短路径 Dijkstra算法

第一看完Dijkstra算法感觉就四个字————步步贪心

想学Dijkstra算法得了解动态规划的思想

怎么解释呢???
举个例子

有一张图n个顶点m条边 每条边上都有权值叫你求顶点1到其他顶点的最短路径

step 1    找出离顶点1最近的点(这好找吧)使用一个数组将每个点到顶点1 的最短路径记录下来(dis数组)

还有已经找到离顶点1最短路径的要记录下来可以使用一个book数组记录(防止重复记录)

将dis数组中的值于e[][]+dis[][比较  如果后者较小 则更新dis数组

step 2   重复step1 直到book数组中全部记录完全

还是贴代码吧 累

#include<iostream>
#define inf 0x333f
using namespace std;
int main()
{
    int dis[10],book[10],e[10][10],n,m,a,b,v,min,flag;//n表示顶点,m表示边 
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)
            e[i][j]=0;
            else
            e[i][j]=inf;
        }
    }
    for(int i=1;i<=m;i++)
    {
        cin>>a>>b>>v;
        e[a][b]=v;
    }
    for(int i=1;i<=n;i++)
    {
        dis[i]=e[1][i];
     } 
         for(int i=1;i<=n;i++)
    {
        book[i]=0;
     } 
     book[1]=1;
     //找到离单源最短的顶点
     min=inf;
     for(int i=1;i<n;i++)
     {
         min=inf;
         for(int j=1;j<=n;j++)
         {
             if(book[j]==0&&dis[j]<min)
             {
                 min=dis[j];
                 flag=j;
             }
         }
         book[flag]=1;
         for(int k=1;k<=n;k++)
         {
             if(e[flag][k]<inf)
             {
                 if(dis[k]>dis[flag]+e[flag][k])
                 dis[k]=dis[flag]+e[flag][k];
             }
         }
     }
     for(int i=1;i<=n;i++)
     cout<<dis[i]<<" ";
     return 0;
 } 
 
 
 
 
 
 
 

 2020/2/13更新

写的还不错,现在看思路还算清晰,给过去的自己一个好评。

如果你够坚强够勇敢,你就能驾驭他们
原文地址:https://www.cnblogs.com/liuzhaojun/p/11132220.html