1 #include <iostream>
2 #include <cstdlib>
3 #include <cstring>
4 #include <map>
5 using namespace std;
6 /*==================================================*\
7 | Dijkstra 数组实现O (N^2 )
8 | Dijkstra --- 数组实现( 在此基础上可直接改为STL 的Queue实现)
9 | lowcost[] --- beg 到其他点的最近距离
10 | path[] -- beg为根展开的树,记录父亲结点
11 \*==================================================*/
12 #define INF 0x03F3F3F3F
13 //const int N;
14 map<int, int> path, vis;
15 void Dijkstra(map<int, map<int, int> > cost, map<int, int>& lowcost, int n, int beg) {
16 int i, j, min;
17 // memset(vis, 0, sizeof(vis));
18 vis[beg] = 1;
19 for (i = 0; i < n; i++) {
20 lowcost[i] = cost[beg][i];
21 path[i] = beg; //最大的距离
22 }
23 lowcost[beg] = 0; //起点到自身的距离肯定是0
24 path[beg] = -1; // 树根的标记
25 int pre = beg;
26 for (i = 1; i < n; i++) {
27 min = INF;
28 for (j = 0; j < n; j++)
29 // 下面的加法可能导致溢出,INF不能取太大
30 //不能有负值,否则会出问题
31 if (vis[j] == 0 && lowcost[pre] + cost[pre][j] < lowcost[j]) {
32 lowcost[j] = lowcost[pre] + cost[pre][j];
33 path[j] = pre;
34 }
35 for (j = 0; j < n; j++)
36 if (vis[j] == 0 && lowcost[j] < min) { //选择下一个扩展的点
37 min = lowcost[j];
38 pre = j;
39 }
40 vis[pre] = 1;
41 }
42 }
43 int main() {
44 map<int, map<int, int> > cost;
45 map<int, int> lowcost;
46 for (int i = 0; i < 4; i++)
47 for (int j = 0; j < 4; j++) {
48 if (i != j)
49 cost[i][j] = INF;
50 else
51 cost[i][j] = 0;
52 }
53 cost[0][1] = 3;
54 cost[0][2] = 1;
55 cost[0][3] = 10;
56 cost[2][1] = 1;
57 cost[2][3] = 1;
58
59 for (int i = 0; i < 4; i++)
60 vis[i]=0;
61 Dijkstra(cost,lowcost, 4,0);
62 for (int i = 0; i < 4; i++)
63 cout<<lowcost[i]<<endl;
64 return 0;
65 }