实验三:C#实现求图的任意两点的最短路径及距离
实验目的
定义Graph类、Node类,从文件中读取图结构;给定两个顶点,给出两个顶点的最短路径(如果没有连通,请给出)。把图进行可视化展示(一个适当大小的图),同时把计算的结果可视化展示。
环境
- 操作系统: Windows 10 X64
- IDE: visual studio 2017
- 语言:C#
算法
Floyd算法求图的任意两点的最短路径及距离
- 若<vi, vj>存在,则存在路径{vi, vj};
- 若<vi, u0>,<u0, vj>存在,则存在路径{vi, u0, vj}; ——路径中还包含u0顶点
- 若<vi, u0>,<u0, u1>,<u1, vj>存在,则存在路径{vi, u0, u1, vj}; 路径中还包含u0和u1两个顶点
- 依次类推。
存储结构
private int vexnum;//顶点数
private int arenum;//弧(边)数
private int[,] matrix;//邻接矩阵(存储图)
public int[] road;//任意两点间的最短路径
int[,] c_matrix;//二维数组,保存两点间的最短距离值
private int[,] path;//保存路径,i-j,j的直接前驱
Floyd算法具体实现
思路:
在c_matrix中循环加入点,更新最短距离
代码:
public void Floyd()
{
//int[,] c_matrix;//二维数组,保存两点间的最短路径值
//int[,] path;//保存路径,i-j,j的直接前驱
//申请空间
c_matrix = new int[vexnum + 1, vexnum + 1];
path = new int[vexnum + 1, vexnum + 1];
for (int i = 1; i <= vexnum; i++)//初始化
{
for (int j = 1; j <= vexnum; j++)
{
if ((c_matrix[i, j] =