有向网邻接矩阵求最短路径之Floyd弗洛伊德算法的理解与C#代码实现

算法理解

1.定义两个二维数组D和P,D是网图的邻接矩阵,P是路径矩阵

public void Floyd(ref int[,] pathMatrixArr,ref int[,] shortPathTable){}

2.初始化两个数组,shortPathTable默认值为邻接矩阵数组,pathMatrixArr数组默认值为列的下标

int v, w, k;
//初始化两个数组
for (v = 0; v < nodes.Length; v++)
{
	for (w = 0; w < nodes.Length; w++)
	{
		shortPathTable[v, w] = matrix[v, w];
		pathMatrixArr[v, w] = w;
	}
}

3.三层for循环嵌套,第一次k为中转的顶点,寻找在v和w两顶点之间存在v到k的距离加上k到w的距离小于v到w的距离的情况是否存在,如果存在就将最小值付给v到w的距离即shortPathTable[v,w]。pathMatrixArr则是把每次确定的最短路径上的中转顶点k存在路径上

for (k=0;k<nodes.Length;k++)
{
	for (v = 0; v < nodes.Length; v++)
	{
		for (w = 0; w < nodes.Length; w++)
		{
			if (shortPathTable[v, w] > shortPathTable[v, k] + shortPathTable[k, w])
			{
				//如果经过下标为k顶点路径比原两顶点之间的路径更短则将两点之间权值设为更小的
				shortPathTable[v, w] = shortPathTable[v, k] + shortPathTable[k, w];
				//路径设置经过下标为k的顶点
				pathMatrixArr[v, w] = pathMatrixArr[v, k];
			}
		}
	}
}

完整实现

public void Floyd(ref int[,] pathMatrixArr,ref int[,] shortPathTable)
{
    int v, w, k;
    //初始化两个数组
    for (v = 0; v < nodes.Length; v++)
    {
        for (w = 0; w < nodes.Length; w++)
        {
            shortPathTable[v, w] = matrix[v, w];
            pathMatrixArr[v, w] = w;
        }
    }
    for (k=0;k<nodes.Length;k++)
    {
        for (v = 0; v < nodes.Length; v++)
        {
            for (w = 0; w < nodes.Length; w++)
            {
                if (shortPathTable[v, w] > shortPathTable[v, k] + shortPathTable[k, w])
                {
                    //如果经过下标为k顶点路径比原两顶点之间的路径更短则将两点之间权值设为更小的
                    shortPathTable[v, w] = shortPathTable[v, k] + shortPathTable[k, w];
                    //路径设置经过下标为k的顶点
                    pathMatrixArr[v, w] = pathMatrixArr[v, k];
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/u012187817/article/details/82587594