重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]

前言

佛洛伊德算法和迪杰斯特拉算法非常像,但是它求的是任何一个点到其他点之间的距离。

假设有一张图:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第1张图片

转换为矩阵为:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第2张图片

他们的前驱为:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第3张图片

可能上面表述前驱不清楚,举个例子。

看下图:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第4张图片

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第5张图片

这第二种图表示,从A 经过A 到B,B点的前驱是A,他们的长度是5,红框中的数表示是A经过的点。

现在A到不了D,A经过A到D就是N,表示无限大。

所以我们需要更新数据,得到最优解。

解法如下:

举个例子,原始图是A通过A到B的距离。

那么可以尝试这样,让所以的点经过A到达其他的点,他们的距离是否更短。如图:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第6张图片
以此类推其他。

正文

代码:

static void Main(string[] args)
{
	// 测试看看图是否创建成功
	char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
	//创建邻接矩阵
	int N = 65535;
	int[,] matrix = {
	  { 0, 5, 7, N, N, N, 2 },
	  { 5, 0, N, 9, N, N, 3 },
	  { 7, N, 0, N, 8, N, N },
	  { N, 9, N, 0, N, 4, N },
	  { N, N, 8, N, 0, 5, 4 },
	  { N, N, N, 4, 5, 0, 6 },
	  { 2, 3, N, N, 4, 6, 0 }};
	GraphFoy graph = new GraphFoy(matrix, vertex);
	graph.floyd();
	graph.show();
	Console.Read();
}
}
class GraphFoy {
private char[] vertex;
private int[,] dis;
private int[,] pre;
public GraphFoy(int[,] matrix,char[] vertex)
{
	this.vertex = vertex;
	this.dis = matrix;
	this.pre = new int[vertex.Length,vertex.Length];
	for (int i=0;i

结果如下:

重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二]_第7张图片

你可能感兴趣的:(重新整理数据结构与算法(c#)——算法套佛洛伊德算法[三十二])