C++所有顶点之间的最短路径所有顶点之间的最短路径
主要为大家详细介绍了C++所有顶点之间的最短路径,文中示例代码介绍的非常详细,具有一定的参考价值,感
兴趣的小伙伴们可以参考一下
本文实例为大家分享了C++所有顶点之间最短路径的具体代码,供大家参考,具体内容如下
一、思路:一、思路: 不能出现负权值的边不能出现负权值的边
用Floyd算法,总的执行时间为O(n的3次方)
k从顶点0一直到顶点n-1,
如果,有顶点i到顶点j之间绕过k,使得两顶点间的路径更短,即dist[i][k] + dist[k][j] < dist[i][j],则修改:dist[i][j]
如:(1)当k=0时,
顶点2绕过顶点0到达顶点1,使得路径为:3+1 < dist[2][1],所以,要修改dist[2][1]=4,同时要修改path[2][1]=path[0][1];
顶点2绕过顶点0到达顶点3,使得路径为:3+4 < dist[2][3],所以,要修改dist[2][1]=7,同时要修改path[2][3]=path[0][3];
(2)当k=1时,
顶点2绕过顶点1到达顶点3,使得路径为:2->0->1->3,3+1+2=6 <dist[2][3]=7,所以,要修改dist[2][3]=6,同时要修改path[2]
[3]=path[1][3];
一直重复上面步骤,直到k=6
二、实现程序:二、实现程序:
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)上的权值