最短路径Dijkstra算法源码

来源:互联网 发布:linux udp客户端程序 编辑:程序博客网 时间:2024/06/05 06:36

Dijkstra算法源码


Dijkstra.h文件源码

#pragma once#include "stdafx.h"#include <vector>using namespace std;//arcs中arcs[i][j] < 0,表示不可达class Dijkstra{private:    int _num;    float** _arcs;    float* _dis;    int* _pre;    bool* _used;public:    Dijkstra(float** arcs, int num);    void Dijkstra::FindPath(int s, int t, vector<int>& route,float& pathLen);};

Dijkstra.cpp源码

#include "stdafx.h"#include "Dijkstra.h"#include <limits> Dijkstra::Dijkstra(float** arcs, int num){    this->_arcs = arcs;    this->_num = num;    this->_dis = new float[num];    this->_pre = new int[num];    this->_used = new bool[num];}//最短路径Dijkstra算法,从s索引到t索引寻最短路径,索引从0开始void Dijkstra::FindPath(int s, int t, vector<int>& route,float& pathLen){    int i, j;    route.clear();    pathLen = 0;    float floatMax = (numeric_limits<float>::max)();    for (i = 0; i < _num; i++)    {        _dis[i] = floatMax;        _pre[i] = -1;        _used[i] = false;    }    //初始化起点的最短路径    _dis[s] = 0;    _pre[s] = -1;    for (j = 0; j < _num; j++)    {        //找到当前路径中值最小作为下次的起点        s = -1;        for (i = 0; i < _num; i++)        {            if (_used[i] == false && (s == -1 || _dis[i] < _dis[s]))            {                s = i;            }        }        _used[s] = true;        if (s == t)        {            break;        }        for (i = 0; i < _num; i++)        {            if (_used[i] == false && _arcs[s][i] >= 0 && _dis[s] + _arcs[s][i] < _dis[i])            {                _dis[i] = _dis[s] + _arcs[s][i];                _pre[i] = s;            }        }    }    if (_dis[t] < floatMax)    {        pathLen +=_dis[t];        //获得路径        int now = t;        while (now != -1)        {            route.insert(route.begin(), now);            now = _pre[now];        }    }}

TestDijkstra.h

#pragma once#include "stdafx.h"#include "Dijkstra.h"#include <iostream>using namespace std;class TestDijkstra{public:    void DoTest()    {        float arcsArr[5][5] = {            {0,  8, -1, -1, 2},            {8,  0,  2,  0, 6},            {-1, 2,  0,  3, 3},            {-1, -1, 3,  0, 4},            {2,  6,  3,  4, 0}};            float** arcs = new float*[5];            for(int i=0;i<5;i++)            {                arcs[i] = &arcsArr[i][0];            }            Dijkstra* dijkstra = new Dijkstra(arcs, 5);            vector<int> path1;            float len1;            dijkstra->FindPath(0, 1, path1, len1);            cout<<"0->1 "<< len1 << endl;            vector<int> path2;            float len2;            dijkstra->FindPath(3, 0, path2, len2);            cout <<"3->0 " << len2 << endl;    }};
0 0
原创粉丝点击