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 }

 

posted on 2019-04-01 20:44  jephsdge  阅读(164)  评论(0)    收藏  举报