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

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

  2.

      

                                                                   原图来自:http://blog.sina.com.cn/s/blog_4b9aefc20100zu8h.html

3.代码实现:

 1 /* 用邻接矩阵表示的图的Dijkstra算法的源程序*/
 2 
 3 #include <iostream>
 4 using namespace std;
 5 #define MAXVEX 100
 6 #define MAX 1e+4
 7 typedef char VexType;
 8 typedef float AdjType;
 9 
10 typedef struct
11 {
12     int n;                            //图的顶点个数
13   //  VexType vexs[MAXVEX];            //顶点
14     AdjType arcs[MAXVEX][MAXVEX];   //
15 }GraphMatrix;
16 
17 typedef struct {
18   //  VexType vertex;           //顶点信息
19     AdjType length;       // 最短路径长度
20     int prevex;          // 从v0到达vi(i=1,2,…n-1)的最短路径上vi的前驱顶点
21 }Path;
22 Path dist[6];          // n为图中顶点个数
23 
24 void dijkstra(GraphMatrix graph, Path dist[])
25 {
26     int i,j,minvex;
27     AdjType min; // 初始化,此时集合U中只有顶点v0
28     dist[0].length = 0;    dist[0].prevex = 0;   
29     graph.arcs[0][0] = 1;   // 表示顶点v0在集合U中
30 
31     for(i = 1; i < graph.n; i++) 
32     {  // 初始化集合V-U中顶点的距离值
33         dist[i].length=graph.arcs[0][i];
34         if (dist[i].length != MAX)
35             dist[i].prevex=0;
36         else  dist[i].prevex= -1;
37     }
38     for(i = 1; i < graph.n; i++) 
39     {
40         min=MAX;    minvex=0;
41         for (j = 1; j < graph.n; j++) //在V-U中选出距离值最小顶点
42             if( graph.arcs[j][j] == 0 && dist[j].length < min ) 
43             {
44                 min=dist[j].length;  minvex=j;
45             }
46            if(minvex == 0) break;    // 从v0没有路径可以通往集合V-U中的顶点
47         graph.arcs[minvex][minvex] = 1;    // 集合V-U中路径最小的顶点为minvex,标记已经找过的结点
48         for (j = 1; j < graph.n; j++) 
49         {    
50             // 调整集合V-U中的顶点的最短路径
51             if(graph.arcs[j][j] == 1)  continue;
52             if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j]) {
53                 dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
54                 dist[j].prevex = minvex;
55             }
56         }
57     }
58 }
59 
60 GraphMatrix graph;
61 
62 void initgraph(){
63     int i,j;
64     graph.n=6;
65     for (i = 0; i < graph.n; i++)
66         for (j = 0; j < graph.n; j++)
67             graph.arcs[i][j] = (i == j ? 0 : MAX);
68     graph.arcs[0][1] = 50;
69     graph.arcs[0][2] = 10;
70     graph.arcs[1][2] = 15;
71     graph.arcs[1][4] = 5;
72     graph.arcs[2][0] = 20;
73     graph.arcs[2][3] = 15;
74     graph.arcs[3][1] = 20;
75     graph.arcs[3][4] = 35;
76     graph.arcs[4][3] = 30;
77     graph.arcs[5][3] = 3;
78     graph.arcs[0][4] = 45;
79 }
80 
81 int main(){
82     int i;
83     initgraph();
84     dijkstra(graph, dist);
85     for (i = 0; i < graph.n; i++)
86         printf("结点=%d (路径长度=%.0f 上一个节点=%d)\t\n",i, dist[i].length,dist[i].prevex);
87     system("pause");
88     return 0;
89 }

结果展示:

学习建议:看书对于算法理解不如代码分步运行来的直接!

                                                          

posted on 2016-05-26 15:49  Cultivate  阅读(864)  评论(0编辑  收藏  举报

导航