Dijkstra C++实现

来源:互联网 发布:中国各省贸易数据库 编辑:程序博客网 时间:2024/05/17 09:30

本文给出一个Dijkstra 算法的实现。。。

#include <iostream>#include <list>#include <vector>using namespace std;class Edge{public:    int dst;    int len;    Edge(int d, int l) :dst(d), len(l){};};//图上的一个顶点class TableEntry{public:    list<Edge> edges; //以顶点为起点的边    bool known;    int dist; //最短路径的长度    int path; //最短路径的上一个顶点};typedef vector<TableEntry> Table;class Dijkstra{public:    void IntializeTable(Table & T, int start)    {        ReadGraph(T);        for (int i = 0; i < T.size(); i++)        {            T[i].known = false;            T[i].dist = -1;            T[i].path = -1;        }        T[start].dist = 0;    }    void Run(Table & T)    {        while (true)        {            int v = GetMinPos(T);            if (v < 0)                break;            T[v].known = true;            list<Edge>::iterator it;            for (it = T[v].edges.begin(); it != T[v].edges.end(); it++)            {                int w = it->dst;                if (T[w].dist < 0 || T[w].dist > T[v].dist + it->len)                {                    T[w].dist = T[v].dist + it->len;                    T[w].path = v;                }            }        }    }    void PrintPath(Table & T, int v)    {        if (T[v].path >= 0)        {            PrintPath(T, T[v].path);            cout << "->";        }        cout << v;    }private:    // 读取图上的边,这个大家随意发挥    void ReadGraph(Table & T)    {        T[0].edges.push_back(Edge(1, 7));        //...    }    int GetMinPos(Table & T)    {        int ret = -1;        for (int i = 0; i < T.size(); i++)        {            if (false == T[i].known)            {                if (ret < 0)                {                    ret = i;                }                else if (T[i].dist > 0 && T[i].dist < T[ret].dist)                {                    ret = i;                }            }        }        return ret;    }};int main(){    Table T(6, TableEntry());    Dijkstra dijkstra = Dijkstra();    dijkstra.IntializeTable(T, 0);    dijkstra.Run(T);    dijkstra.PrintPath(T, 5);    system("PAUSE");    return 0;}
0 0
原创粉丝点击