图-最短路径-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 }
结果展示:
学习建议:看书对于算法理解不如代码分步运行来的直接!