一、实现的最终效果
- 从键盘中输入有向图:首先输入有向图中总共的结点数与边数,然后再输入每一条边的信息,输入格式如下:From:起点,Weight:边的权重, To:终点。
2. 打印输入有向图的结果:以邻接矩阵的形式打印出矩阵结果。
3. 求解最优路径:
二、Dijkstra算法原理
原理
Dijkstra算法是一种根据路径长度的递增顺序,逐步求出最短路径的算法,其主要思想为:首先求得一条最短的路径,然后再根据该条最短路径求得次最短路径,如此循环上述操作,最终求得一顶点至其他所有点的最短路径。如:
由上图可知,由源点v出发的最短路径为v-v1,此时就可确定已最短路径为v-v1有最短路径的基础上,从v1出发,看是否通过v1到其他点的路径,若新得到的路径比原本v到vn的路径短,则用v-v1-vn代替v-vn的路径,在此轮更新完毕后,选出路径中新得到的最小路径做为次最小路径,如此循环,即得到v到其他所有顶点的最短路径。
流程
有向图如图所示:
寻找A到其他各点最短路径的步骤如下:
进行第一轮地筛选:
得到最第一轮中的最短路径为A-B的路径,路径长度为1,在A-B的路径基础上进行第二轮筛选:
由上可知,由B出发可有的相邻结点有:B-C(长度为4)、B-D(长度为2)、B-E(长度为5),得到几条新的路径:A-B-C(长度为5)、A-B-D(长度为3)、A-B-E(长度为6),因为A-B-C比A-C短,A-B-D比A-D短,A-B-E比A-E长,所以更新A到C的路径,更新A到D的路径,最终得到的第二轮筛选结果如下所示。
在第二轮筛选的结果中,最短路径为A-E,所以,通过A-E进行第三轮筛选:由E出发相邻的结点有:E-D(长度为3)(因为A-B已经是最短的路径,所以此处不用再算E到B的路径),得到的新路径为:A-E-D(长度为6),因A-E-D比A-D长,所以不用更新任何路径,结果如下。
由第三轮筛选结果得,A-B-D是最短的路径,所以在此基础上进行第四轮筛选:D无任何相邻结点,所以更新后结果如下。
至此,通过Dijkstra算法求出A到其它顶点的最优路径过程完毕,各最优路径分别为:
A到B:A-B,长度为1;
A到C: A-B-C,长度为5;
A到D: A-B-D, 长度为3;
A到E: A-E,长度为3。
三、代码实现
有向图的类代码
class GraphMatrix{
public:
~GraphMatrix();
void createdGraph();
void printGraph();
void inputVertexNumber(); //输入有向图的结点数目
void makeVertexArray();//生成装有结点的数组
void inputEdgeNumber();//输入有向图的边的数目
void inputEdgeInfo();//输入边的信息,格式为:起点 权重 终点
void addEdgeToList(int vFrom, int weight, int vTo);//添加边到对应的邻接矩阵中
int n();//返回有向图的结点总数
int e();//返回有向图的边的总数
int first(int v);//返回结点v的第一个相邻结点
int next(int v, int w)