C++有向带权图单源最短路径

本文介绍了使用C++编程实现有向带权图的单源最短路径算法,包括Dijkstra算法和Bellman-Ford算法。代码采用泛型编程,适用于处理图中节点为任意类型的情况,详细算法原理可参照相关算法书籍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++有向带权图单源最短路径

参考《算法》最短路径章节编写实现代码,包括无负权边无环的Dijkstra算法,也包括可以处理一般性问题的Bellman-Ford算法。同时采用泛型编程,图节点可以实现任意类型,具体原理参见《算法》最短路径章节,实现代码如下所示:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
/*
 顶点       中间节点
 VNode     ENode
 0 | A --> 2(C) 1(B)
 1 | B --> 4(E) 3(D) 0(A)
 2 | C --> 6(G) 5(F) 0(A)
 3 | D --> 7(H) 1(B)
 4 | E --> 7(H) 1(B)
 5 | F --> 6(G) 2(C)
 6 | G --> 5(F) 2(C)
 7 | H --> 4(E) 3(D)
 */

const int MAX = 20;
struct ENode                   //邻接表的中间节点
{
    int adjvex;                //对应索引
    double weight;             //边的权重
    ENode* next;
};

template<class T>
struct VNode                   //邻接表顶点
{
    T vertex;                  //值
    ENode* firstarc;           //指向第一个中间节点
};

template<class T>
class ALGraph                   //图
{
private:
    VNode<T> adjList[MAX];      //邻接表数组
    int vexNum;                 //节点数量
    int arcNum;                 //连边数量
    bool visited[MAX];          //标记被访问
    int edgeTo[MAX];            //最短路径连边记录
    double distTo[MAX];         //最短距离
    queue<int> relax_edge;      //需要放松的队列
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值