算法理解
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];
}
}
}
}
}