1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int MAX = 1e4; 8 const int INF = 1 << 30; 9 10 typedef struct _EdgeData 11 { 12 char Start; /*开始*/ 13 char End; /*结束*/ 14 int Weight; /*权*/ 15 }; 16 17 typedef struct _Graph 18 { 19 char Vexs[MAX]; /*顶底集合*/ 20 int VexNum; /*顶底数*/ 21 int EdgNum; /*边数*/ 22 int Matrix[MAX][MAX]; /*连接矩阵*/ 23 }Graph, *PGraph; 24 25 26 /** 27 * @Function 统计图(G)中"顶点vs"到其它各个顶点的最短路径。 28 * @Parameter 29 * @G 图 30 * @vs 起始节点 31 * @prev 前驱顶点数组。即,prev[i]的值是"顶点vs"到"顶点i"的最短路径所经历的全部顶点中, 32 * 位于"顶点i"之前的那个顶点。 33 * @dist 长度数组。即,dist[i]是"顶点vs"到"顶点i"的最短路径的长度。 34 */ 35 void dijkstra(Graph G, int vs, int prev[], int dist[]) 36 { 37 /*Init*/ 38 int min, temp; 39 int flag[MAX]; 40 for (int i = 0; i < G.VexNum; i++) 41 { 42 flag[i] = 0; 43 prev[i] = 0; 44 dist[i] = G.Matrix[vs][i]; 45 } 46 flag[vs] = 1; 47 dist[vs] = 0; 48 49 /*MainLogic*/ 50 /** 51 * @Step 1 : 在dist中找到最小值,并将该点记录下来,标记为以访问 52 * @Step 2 : 更新dist和prev 53 */ 54 for (int i = 1; i < G.VexNum; i++) 55 { 56 int tempVex; 57 min = INF; 58 /*寻找数组中的最小值*/ 59 for (int j = 0; j < G.VexNum; j++) 60 { 61 if (flag[j] == 0 && dist[j] < min) 62 { 63 min = dist[j]; 64 tempVex = j; 65 } 66 } 67 flag[tempVex] = 1; //找到后标记 68 69 /*更新dist和prev*/ 70 for (int j = 0; j < G.VexNum; j++) 71 { 72 if (flag[j] == 0) 73 { 74 /*核心语句*/ 75 temp = (G.Matrix[tempVex][j] == INF ? INF : (min + G.Matrix[tempVex][j])); 76 if (temp < dist[j]) 77 { 78 dist[j] = temp; 79 prev[j] = tempVex; 80 } 81 } 82 } 83 } 84 85 /*算法结束*/ 86 /** 87 * @最终节点i到vs的最短路径为dist[i] 88 * @最终节点i到vs的最短路径中i的前一个节点为prev[i] 89 */ 90 } 91 92 93 int main() 94 { 95 freopen("in.text", "r", stdin); 96 freopen("out.text", "w", stdout); 97 return 0; 98 }
浙公网安备 33010602011771号