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; //需要放松的队列