「Flody算法Java」floyd算法过程图解

博主:adminadmin 2023-01-08 01:09:08 894

今天给各位分享Flody算法Java的知识,其中也会对floyd算法过程图解进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?

不能编译运行的说法是错误,但是结果是否正确,我就不知道了,我不懂这个算法

public class FLOYD {

int[][] length = null;// 任意两点之间路径长度

int[][][] path = null;// 任意两点之间的路径

public FLOYD(int[][] G) {

int MAX = 100;

int row = G.length;// 图G的行数

int[][] spot = new int[row][row];// 定义任意两点之间经过的点

int[] onePath = new int[row];// 记录一条路径

length = new int[row][row];

path = new int[row][row][];

for (int i = 0; i  row; i++)

// 处理图两点之间的路径

for (int j = 0; j  row; j++) {

if (G[i][j] == 0)

G[i][j] = MAX;// 没有路径的两个点之间的路径为默认最大

if (i == j)

G[i][j] = 0;// 本身的路径长度为0

}

for (int i = 0; i  row; i++)

// 初始化为任意两点之间没有路径

for (int j = 0; j  row; j++)

spot[i][j] = -1;

for (int i = 0; i  row; i++)

// 假设任意两点之间的没有路径

onePath[i] = -1;

for (int v = 0; v  row; ++v)

for (int w = 0; w  row; ++w)

length[v][w] = G[v][w];

for (int u = 0; u  row; ++u)

for (int v = 0; v  row; ++v)

for (int w = 0; w  row; ++w)

if (length[v][w]  length[v][u] + length[u][w]) {

length[v][w] = length[v][u] + length[u][w];// 如果存在更短路径则取更短路径

spot[v][w] = u;// 把经过的点加入

}

for (int i = 0; i  row; i++) {// 求出所有的路径

int[] point = new int[1];

for (int j = 0; j  row; j++) {

point[0] = 0;

onePath[point[0]++] = i;

outputPath(spot, i, j, onePath, point);

path[i][j] = new int[point[0]];

for (int s = 0; s  point[0]; s++)

path[i][j][s] = onePath[s];

}

}

}

void outputPath(int[][] spot, int i, int j, int[] onePath, int[] point) {// 输出i//

// 到j//

// 的路径的实际代码,point[]记录一条路径的长度

if (i == j)

return;

if (spot[i][j] == -1)

onePath[point[0]++] = j;

// System.out.print(" "+j+" ");

else {

outputPath(spot, i, spot[i][j], onePath, point);

outputPath(spot, spot[i][j], j, onePath, point);

}

}

public static void main(String[] args) {

int data[][] = {

{ 0, 27, 44, 17, 11, 27, 42, 0, 0, 0, 20, 25, 21, 21, 18, 27, 0 },// x1

{ 27, 0, 31, 27, 49, 0, 0, 0, 0, 0, 0, 0, 52, 21, 41, 0, 0 },// 1

{ 44, 31, 0, 19, 0, 27, 32, 0, 0, 0, 47, 0, 0, 0, 32, 0, 0 },// 2

{ 17, 27, 19, 0, 14, 0, 0, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0 },// 3

{ 11, 49, 0, 14, 0, 13, 20, 0, 0, 28, 15, 0, 0, 0, 15, 25, 30 },// 4

{ 27, 0, 27, 0, 13, 0, 9, 21, 0, 26, 26, 0, 0, 0, 28, 29, 0 },// 5

{ 42, 0, 32, 0, 20, 9, 0, 13, 0, 32, 0, 0, 0, 0, 0, 33, 0 },// 6

{ 0, 0, 0, 0, 0, 21, 13, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0 },// 7

{ 0, 0, 0, 0, 0, 0, 0, 19, 0, 11, 20, 0, 0, 0, 0, 33, 21 },// 8

{ 0, 0, 0, 0, 28, 26, 32, 0, 11, 0, 10, 20, 0, 0, 29, 14, 13 },// 9

{ 20, 0, 47, 30, 15, 26, 0, 0, 20, 10, 0, 18, 0, 0, 14, 9, 20 },// 10

{ 25, 0, 0, 0, 0, 0, 0, 0, 0, 20, 18, 0, 23, 0, 0, 14, 0 },// 11

{ 21, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 27, 22, 0, 0 },// 12

{ 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0 },// 13

{ 18, 41, 32, 31, 15, 28, 0, 0, 0, 29, 14, 0, 22, 0, 0, 11, 0 },// 14

{ 27, 0, 0, 0, 25, 29, 33, 0, 33, 14, 9, 14, 0, 0, 11, 0, 9 },// 15

{ 0, 0, 0, 0, 30, 0, 0, 0, 21, 13, 20, 0, 0, 0, 0, 9, 0 } // 16

};

for (int i = 0; i  data.length; i++)

for (int j = i; j  data.length; j++)

if (data[i][j] != data[j][i])

return;

FLOYD test = new FLOYD(data);

for (int i = 0; i  data.length; i++)

for (int j = i; j  data[i].length; j++) {

System.out.println();

System.out.print("From " + i + " to " + j + " path is: ");

for (int k = 0; k  test.path[i][j].length; k++)

System.out.print(test.path[i][j][k] + " ");

System.out.println();

System.out.println("From " + i + " to " + j + " length :"

+ test.length[i][j]);

}

}

}

弗洛伊德算法介绍 弗洛伊德算法资料

1、Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

2、在计算机科学中,Floyd-Warshall算法是一种在具有正或负边缘权重(但没有负周期)的加权图中找到最短路径的算法。算法的单个执行将找到所有顶点对之间的最短路径的长度(加权)。虽然它不返回路径本身的细节,但是可以通过对算法的简单修改来重建路径。该算法的版本也可用于查找关系R的传递闭包,或(与Schulze投票系统相关)在加权图中所有顶点对之间的最宽路径。

求数据结构公交线路咨询的代码用java,其中求最短路径用Floyd算法

不知道你想怎么搞 反正感觉A*算法也可以,网上一大堆,还有就是Dijkstra算法

Floyd算法是什么?

Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。

采用的是(松弛技术),对在i和j之间的所有其他点进行一次松弛。所以时间复杂度为O(n^3); 其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]} map[i,j]表示i到j的最短距离 K是穷举i,j的断点 map[n,n]初值应该为0,或者按照题目意思来做。

当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路

关于Flody算法Java和floyd算法过程图解的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。