前两个月在实习,刚回来又忙着找工作的事情,又好久没写博客了。想起来好久没碰数据结构了,捡起那本学校的教材–严蔚敏的数据结构,看了看她的迪杰斯特拉算法。
书上的代码相当简洁,但是有一个问题是只能找到路径上的点,并没有将其顺序存起来,所以我就对其进行了一丢丢的该进。
把代码用C++重写了一遍,在VS 2015上能编译通过
#include "iostream"
#include "vector"
using namespace std;
#define MaxNum 65535
#define Num 6
int G[Num][Num] = { {MaxNum, 7, 9, MaxNum, MaxNum, 14},
{7, MaxNum, 10, 15, MaxNum, MaxNum},
{9, 10, MaxNum, 11, MaxNum, 2},
{MaxNum, 15, 11, MaxNum, 6, MaxNum},
{MaxNum, MaxNum, MaxNum, 6, MaxNum, 9},
{14, MaxNum, 2, MaxNum, 9, MaxNum} };
vector<vector<int>> P;
int D[Num];
bool Final[Num];
void Dij(int v0) {
for (int v = 0; v < Num; ++v) {
Final[v] = false;
D[v] = G[v0][v];
vector<int> temp;
if (D[v] < MaxNum) {
temp.push_back(v0);
temp.push_back(v);
}
P.push_back(temp);
}
D[v0] = 0;
Final[v0] = true;
int v = 0;
for (int i = 0; i < Num; ++i) {
int min = MaxNum;
for (int w = 0; w < Num; ++w) {
if (!Final[w] && D[w] < min) {
min = D[w];
v = w;
}
}
Final[v] = true;
for (int w = 0; w < Num; ++w) {
if ((!Final[w]) && (min + G[v][w] < D[w])) {
D[w] = min + G[v][w];
P[w] = P[v];
P[w].push_back(w);
}
}
}
}
int main() {
Dij(0);
for (int i = 0; i < P.size(); ++i) {
cout << i << ": ";
for (int j = 0; j < P[i].size(); ++j) {
cout << P[i][j] << "\t";
}
cout << endl;
cout << "len = " << D[i] << endl;
}
system("pause");
}