迪杰斯特拉(Dijkstra)最短路径算法C++版

迪杰斯特拉(Dijkstra)最短路径算法C++实现



前言

算法参考:《大话数据结构》


一、图的结构

使用邻接表来保存顶点之间连接的信息

二、C++实现

代码如下(示例):

#pragma once
#include <vector>
#include <string>

/*
 *brief  \邻接表的连接两个顶点的边
 *param  \
 */
struct ArcNode
{
   
   
    // 边的信息
    int weight = 0;             // 权重
    // ...

    int vexIndex = -1;          // 边指向的顶点的索引
    ArcNode* next = nullptr;    // 指向的下一条边

    ArcNode(int weight, int vertexIndex, ArcNode* node = nullptr)
        : weight(weight),
          vexIndex(vertexIndex),
          next(node)
    {
   
   
    }
};

/*
 *brief  \邻接表的顶点信息
 *param  \
 */
struct Vertex
{
   
   
    std::string data;           // 顶点信息
    int in = 0;                 // 顶点入度
    ArcNode* first = nullptr;   // 指向的第一条边

    Vertex() {
   
   }
    Vertex(const std::string& d, int in, ArcNode* arc = nullptr)
        : data(d),
          in(in),
          first(arc)
    {
   
   
    }

    // 插入边(头插法)
    void insertArc(ArcNode* node)
    {
   
   
        node->next = first;
        first = node;
    }
};

/*
 *brief  \邻接表
 *param  \
 */
struct ALGraph
{
   
   
    int arcNum = 0;     // 边数量
    int vertexNum = 0;  // 顶点数量

    std::vector<Vertex> vertices;
};

/*
 *brief  \最短路径算法: 迪杰斯特拉
 *param  \
 */
class ShortestPath
{
   
   
public:
    ShortestPath(int vexNum, int arcNum, const std::vector<Vertex>& vertices)
    {
   
   
        m_alGraph.arcNum = arcNum;
        m_alGraph.vertexNum = vexNum;
        m_alGraph.vertices = vertices;
    }

    // 求v0顶点到任意顶点的最短路径
    void Dijkstra
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值