zoukankan      html  css  js  c++  java
  • Dijkstra算法

    想了解更多:click here...

    HERE..

    一、最短路径

      ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径。

     

    AE:1    ADE:2   ADCE:3   ABCE:3

      ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径。 

    AE:100   ADE:90   ADCE:60   ABCE:70

      ③单源点最短路径问题

      问题描述:给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径。

      应用实例——计算机网络传输的问题:怎样找到一种最经济的方式,从一台计算机向网上所有其它计算机发送一条消息。

      ④每一对顶点之间的最短路径

      问题描述:给定带权有向图G=(V, E),对任意顶点vi,vj∈V(i≠j),求顶点vi到顶点vj的最短路径。

      解决办法1:每次以一个顶点为源点,调用Dijkstra算法n次。显然,时间复杂度为O(n3)。 解决办法2:弗洛伊德提出的求每一对顶点之间的最短路径算法——Floyd算法,其时间复杂度也是O(n3),但形式上要简单些。

    二、Dijkstra算法

      ①基本思想:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

      ②设计数据结构 :

      1、图的存储结构:带权的邻接矩阵存储结构 。

      2、数组dist[n]:每个分量dist[i]表示当前所找到的从始点v到终点vi的最短路径的长度。初态为:若从v到vi有弧,则dist[i]为弧上权值;否则置dist[i]为∞。

      3、数组path[n]:path[i]是一个字符串,表示当前所找到的从始点v到终点vi的最短路径。初态为:若从v到vi有弧,则path[i]为vvi;否则置path[i]空串。

      4、数组s[n]:存放源点和已经生成的终点,其初态为只有一个源点v。

      ③Dijkstra算法——伪代码

    复制代码
    1 1. 初始化数组dist、path和s;
    2 2. while (s中的元素个数<n)
    3      2.1 在dist[n]中求最小值,其下标为k;
    4      2.2 输出dist[j]和path[j];
    5      2.3 修改数组dist和path;
    6      2.4 将顶点vk添加到数组s中;
    复制代码

       ④C++代码实现

    复制代码
     1 #include<iostream>
     2 #include<fstream>
     3 #include<string>
     4 using  namespace std;
     5 #define MaxSize  10
     6 #define MAXCOST 10000
     7 // 图的结构
     8 template<class T>
     9 struct Graph
    10 {
    11     T vertex[MaxSize];// 存放图中顶点的数组
    12     int arc[MaxSize][MaxSize];// 存放图中边的数组
    13     int vertexNum, arcNum;// 图中顶点数和边数
    14 };
    15 // 最短路径Dijkstra算法
    16 void Dijkstra(Graph<string> G,int v)
    17 {
    18     int dist[MaxSize];//  i到j的路径长度
    19     string path[MaxSize];// 路径的串
    20     int s[MaxSize];// 已找到最短路径的点的集合
    21     bool Final[MaxSize];//Final[w]=1表示求得顶点V0至Vw的最短路径
    22     // 初始化distpath
    23     for (int i = 0; i < G.vertexNum; i++)
    24     {
    25         Final[i] = false;
    26         dist[i] = G.arc[v][i];
    27         if (dist[i] != MAXCOST)
    28             path[i] = G.vertex[v] + G.vertex[i];
    29         else
    30             path[i] = " ";        
    31     }
    32     s[0] = v; // 初始化s
    33     Final[v] = true;
    34     int num = 1;
    35     while (num < G.vertexNum)
    36     {
    37         // 在dist中查找最小值元素
    38         int k = 0,min= MAXCOST;
    39         for (int i = 0; i < G.vertexNum; i++)
    40         {
    41             if (i == v)continue;
    42             if (!Final[i] && dist[i] < min)
    43             {
    44                 k = i;
    45                 min = dist[i];
    46             }                
    47         }
    48         cout << dist[k]<<path[k]<<endl;
    49         s[num++] = k;// 将新生成的结点加入集合s
    50         Final[k] = true;
    51         // 修改dist和path数组
    52         for (int i = 0; i < G.vertexNum; i++)
    53         {
    54             if (!Final[i]&&dist[i] > dist[k] + G.arc[k][i])
    55             {
    56                 dist[i] = dist[k] + G.arc[k][i];
    57                 path[i] = path[k] + G.vertex[i];
    58             }
    59         }
    60     }
    61 }
    62 int main()
    63 {
    64     // 新建图
    65     Graph<string> G;
    66     string temp[]= { "v0","v1","v2","v3","v4" };
    67     /*int length = sizeof(temp) / sizeof(temp[0]);
    68     G.vertexNum = length;
    69     G.arcNum = 7;*/
    70     ifstream in("input.txt");
    71     in >> G.vertexNum >> G.arcNum;
    72     // 初始化图的顶点信息
    73     for (int i = 0; i < G.vertexNum; i++)
    74     {
    75         G.vertex[i] = temp[i];
    76     }
    77     //初始化图G的边权值
    78     for (int i =0; i <G.vertexNum; i++)
    79     {
    80         for (int j = 0; j <G.vertexNum; j++)
    81         {
    82             G.arc[i][j] = MAXCOST;
    83         }
    84     }
    85     for (int i = 0; i < G.arcNum; i++)
    86     {
    87         int m, n,cost;
    88         in >> m >> n >> cost;
    89         G.arc[m][n] = cost;
    90     }
    91     Dijkstra(G, 0);
    92     system("pause");
    93     return 0;
    94 }
    复制代码
    复制代码
    // input.txt
    1 5 7 2 0 1 10 3 0 3 30 4 0 4 100 5 1 2 50 6 2 4 10 7 3 2 20 8 3 4 60
    复制代码
  • 相关阅读:
    菜根谭#298
    菜根谭#297
    菜根谭#296
    菜根谭#295
    菜根谭#294
    菜根谭#293
    菜根谭#292
    菜根谭#291
    菜根谭#290
    菜根谭#289
  • 原文地址:https://www.cnblogs.com/DWVictor/p/10283327.html
Copyright © 2011-2022 走看看