单源最短路径之Dijkstra算法C++实现

该算法的目的是在图G中给定一个顶点S,找出从顶点S到图中所有其他点的最短路径。

在下图中可以体会该算法的过程,示例以A为起点,可以有图表得出结论:A到各结点最短距离:B=5,C=3,D=10,E=18

C++代码实现。

Dijkstra算法和主函数:

 

#include "stdafx.h"
#define MaxSize 5       //图的顶点数
//基础版算法实现
//Initialize the D array
//D数组用来存放到各节点之间的距离。INFINITY表示无穷,我设为999.
void InitD(int* D, int v, int size) {
    for (int i = 0; i < size; i++)
        D[i] = INFINITY;
    D[v] = 0;           //v表示起点,自己到自己的距离更新为0
}
//Find the min cost vertex
int minVertex(Graghm* G, int* D) {
    int i, v = -1;
    //Initialize v to some unvisited vertex
    for (i = 0; i < G->n(); i++)
        if (G->getMark(i) == UNVISITED) { v = i; break; }
    for (i++; i < G->n(); i++)
        if ((G->getMark(i) == UNVISITED) && (D[i] < D[v]))//通过D数组中距离找出下一个处理的结点。
            v = i;        
    return v;
}
//Compute shortest path distances from s
//Return these distances from "s"
void Dijkstra(Graghm* G, int* D, int s) {
    int i, v, w;
    for (i = 0; i < G->n(); i++) {        //process the vertices
        v = minVertex(G, D);
        if (D[v] == INFINITY)return;
        G->setMark(v, VISITED);
        for (w = G->first(v); w < G->n(); w = G->next(v, w)) {
            if (D[w] > D[v] + G->weight(v, w))
                D[w] = D[v] + G->weight(v, w);
        }
    }
}

int main()
{
    ///
    //构造图
    Graghm G(MaxSize);
    int INIT[MaxSize][MaxSize];
    cout << "根据提示输入点与点之间的边的权重,无边则为0" << endl;
    for (int i = 0; i < MaxSize; i++)
    {
        for (int j = 0; j < MaxSize; j++)
        {
            cout << "结点" << i << "到结点" << j << "的权重=";
            cin >> INIT[i][j];
            cout << endl;
        }
    }
    for (int i = 0; i < MaxSize; i++)
        for (int j = 0; j < MaxSize; j++)
        {
            if (INIT[i][j] != 0) {
                G.setEdge(i, j, INIT[i][j]);
            }
        }

   
    int D[4] = { 0 };
    InitD(D, 2, 4);
    Dijkstra(&G, D, 2);
    for (int i = 0; i < 4; i++) {
        cout << "顶点2与" << i << "之间的最短距离为" << D[i]<<endl;
    }
    return 0;
}

邻接矩阵实现的图:

//Implementation for the adjacency matrix representation
//邻接矩阵
class Graghm :public Gragh {
private:
    int numVertex, numEdge;//Store the number of vertices,edges
    int **matrix;         //pointer to asjacency matrix
    int *mark;             //pointer to mark array

public:
    Graghm(int numVert) //Constructor
    {
        Init(numVert);
    }

    ~Graghm() {
        delete[]mark;//return dynamically allocated memory
        for (int i = 0; i < numVertex; i++)
            delete[]matrix[i];
        delete[] matrix;
    }

    //Initialize the gragh
    void Init(int n) {
        int i;
        numVertex = n;
        numEdge = 0;
        mark = new int[n];
        for (i = 0; i < numVertex; i++)
            mark[i] = UNVISITED;
        matrix = (int **)new int *[numVertex];
        for (i = 0; i < numVertex; i++)
            matrix[i] = new int[numVertex];
        for (i = 0; i < numVertex; i++)
            for (int j = 0; j < numVertex; j++)
                matrix[i][j] = INFINITY;
    }

    //Number of vertices
    int n() { return numVertex; }
    //Number of edges
    int e() { return numEdge; }

    //Return first neighbor of v
    int first(int v) {
        for (int i = 0; i < numVertex; i++)
            if (matrix[v][i] != 0)return i;
        return numVertex; //return n if none
    }

    //return v's next neighbor after w
    int next(int v, int w) {
        for (int i = w + 1; i < numVertex; i++)
            if (matrix[v][i] != 0)
                return i;
        return numVertex;
    }

    //Set the edge bewteen v1,v2,and set the weight"wt"
    void setEdge(int v1, int v2, int wt) {
        if (wt < 0)
        {
            cout << "illegal weight value";
            system("pause");
        }
        if (matrix[v1][v2] == 0)
            numEdge++;
        matrix[v1][v2] = wt;
    }

    //Delete Edge
    void delEdge(int v1, int v2) {
        if (matrix[v1][v2] != 0)numEdge--;
        matrix[v1][v2] = 0;
    }

    //ture if(i,j) is an edge
    bool isEdge(int i, int j) {
        return matrix[i][j] != 0;
    }

    int weight(int v1, int v2) {
        return matrix[v1][v2];
    }
    int getMark(int v) { return mark[v]; }
    void setMark(int v, int val) { mark[v] = val; }
};

欢迎批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值