zoukankan      html  css  js  c++  java
  • 算法-迪杰斯特拉算法(dijkstra)-最短路径

    迪杰斯特拉算法(dijkstra)-最短路径

     

    简介:

    迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

    算法思想:

    设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法结束),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点到S中各顶点的最短路径长度不大于从源点到U中任何顶点的最短路径长度。

    算法步骤:

    G={V,E}
    1. 初始时令 S={V0},T=V-S={其余顶点},T中顶点对应的距离值
    若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
    若不存在<V0,Vi>,d(V0,Vi)为∞
    2. 在(T)未确定的点中选取当前以得的最短路径(与S中顶点有关联边且权值最小)
    3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
    重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

    算法实例:

    代码实例:

     1 #include<iostream>
     2 #include<cstring>
     3 #define INF  1000000 
     4 using namespace std;
     5 const int maxn=1000;
     6 int dis[maxn],g[maxn][maxn],n;//存储最短距离,图矩阵,顶点数 
     7 bool v[maxn];   //判断顶点是否访问 
     8  
     9 void dijkstra()
    10 {
    11     for(int i=1;i<=n;++i) 
    12     dis[i]=INF;//初始化最短距离 
    13     dis[1]=0;//到自身的距离为0 
    14     memset(v,0,sizeof v); //初始化为未访问 
    15    for(int i=1;i<=n;++i)
    16     {
    17         int mark=-1,mindis=INF;
    18         for(int j=1;j<=n;++j)
    19         if(!v[j]&&dis[j]<mindis)//在未确定的点中取当前以得最短路径 
    20         {
    21             mindis=dis[j];
    22             mark=j;
    23         }
    24         v[mark]=1;
    25         for(int j=1;j<=n;++j)//更新最短路径 
    26         if(!v[j])
    27         dis[j]=min(dis[j],dis[mark]+g[mark][j]);
    28     }
    29 }
    30 int main()
    31 {
    32     int m,a,b,c;//边数,顶点a,b,权重 
    33 memset(g,10000,sizeof g);// 初始化图矩阵 
    34
    35 cin>>n>>m; 36 for(int i=0;i<m;i++) 37 { 38 cin>>a>>b>>c; 39 g[a][b]=c; 40 g[b][a]=c; 41 } 42 dijkstra(); 43 for(int i=1;i<=n;i++) 44 { 45 cout<<dis[i]<<endl; 46 } 47 return 0; 48 }

    ps:无负边

    ps:部分资料来源网上 

  • 相关阅读:
    Windows下vim的块选择
    Understand Your Code
    ubuntu中安装man手册查看函数原型
    PypeR
    【入门】用Linux中man命令查询C函数
    用man来查找c函数库 追寻前人的脚步 博客园
    Linux教程 正文 关于vim的模式操作基本概念
    vim的配置管理和部署
    可爱的 Python: 自然语言工具包入门
    简明 Vim 练级攻略
  • 原文地址:https://www.cnblogs.com/qiujun/p/6178621.html
Copyright © 2011-2022 走看看