C++ 求所有顶点之间的最短路径(用Dijkstra算法)

一、思路: 不能出现负权值的边

     

(1)轮流以每一个顶点为源点,重复执行Dijkstra算法n次,就可以求得每一对顶点之间的最短路径及最短路径长度,总的执行时间为O(n的3次方)

(2)另一种方法:用Floyd算法,总的执行时间为O(n的3次方)(另一文章会写)

 

二、实现程序:

     1.Graph.h:有向图

#ifndef Graph_h
#define Graph_h
#include <iostream>
using namespace std;

const int DefaultVertices = 30;

template <class T, class E>
struct Edge { // 边结点的定义
    int dest; // 边的另一顶点位置
    E cost; // 表上的权值
    Edge<T, E> *link; // 下一条边链指针
};

template <class T, class E>
struct Vertex { // 顶点的定义
    T data; // 顶点的名字
    Edge<T, E> *adj; // 边链表的头指针
};

template <class T, class E>
class Graphlnk {
public:
    const E maxValue = 100000; // 代表无穷大的值(=∞)
    Graphlnk(int sz=DefaultVertices); // 构造函数
    ~Graphlnk(); // 析构函数
    void inputGraph(); // 建立邻接表表示的图
    void outputGraph(); // 输出图中的所有顶点和边信息
    T getValue(int i); // 取位置为i的顶点中的值
    E getWeight(int v1, int v2); // 返回边(v1, v2)上的权值
    bool insertVertex(const T& vertex); // 插入顶点
    bool insertEdge(int v1, int v2, E weight); // 插入边
    bool removeVertex(int v); // 删除顶点
    bool removeEdge(int v1, int v2); // 删除边
    int getFirstNeighbor(int v); // 取顶点v的第一个邻接顶点
    int getNextNeighbor(int v,int w); // 取顶点v的邻接顶点w的下一邻接顶点
    int getVertexPos(const T vertex); // 给出顶点vertex在图中的位置
    int numberOfVertices(); // 当前顶点数
private:
    int maxVertices; // 图中最大的顶点数
    int numEdges; // 当前边数
    int numVertices; // 当前顶点数
    Vertex<T, E> * nodeTable; // 顶点表(各边链表的头结点)
};

// 构造函数:建立一个空的邻接表
template <class T, class E>
Graphlnk<T, E>::Graphlnk(int sz) {
    maxVertices = sz;
    numVertices = 0;
    numEdges = 0;
    nodeTable = new Vertex<T, E>[maxVertices]; // 创建顶点表数组
    if(nodeTable == NULL) {
        cerr << "存储空间分配错误!" << endl;
        exit(1);
    }
    for(int i = 0; i < maxVertices; i++)
        nodeTable[i].adj = NULL;
}

// 析构函数
template <class T, class E>
Graphlnk<T, E>::~Graphlnk() {
    // 删除各边链表中的结点
    for(
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值