严蔚敏迪杰斯特拉算法改进

前两个月在实习,刚回来又忙着找工作的事情,又好久没写博客了。想起来好久没碰数据结构了,捡起那本学校的教材–严蔚敏的数据结构,看了看她的迪杰斯特拉算法。

书上的代码相当简洁,但是有一个问题是只能找到路径上的点,并没有将其顺序存起来,所以我就对其进行了一丢丢的该进。

把代码用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");
}

你可能感兴趣的:(数据结构,算法,数据结构)