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

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

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

把代码用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");
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值