概述
弗洛伊德算法名称的由来:弗洛伊德是一个人的名字。1978年图灵奖的获得者。
弗洛伊德算法可以解决的问题:
计算图中各个顶点的距离
代码实现
import java.util.Arrays;
/**
* 弗洛伊德算法
* @author 楠
*
*/
public class FloydDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
creatGraph();
creatPre();
long startMili = System.currentTimeMillis();
floyd();
long endMili = System.currentTimeMillis();
System.out.println("耗时 " + (endMili - startMili));
showEdges(0, 3);
}
static int[][] edges;//图的邻接矩阵
static int[][] distance;//用来存储没两个点之间最短的距离
/**
* 这里适用了查表法
* pre[i][j],表示点j到点i的前驱结点是哪个点
* 注意这里只可以适用前驱结点表示因为点i到j和点i到其他点,点i的后继结点是不同的
*/
static int[][] pre;
/**
* 给定点i和j
* 显示i到j的最短路径是如何走的
* 约定我们这里将下标转换成了字符
* @param i
* @param j
*/
public static void showEdges(int i,int j) {
System.out.println("点"+i+"到点"+j+"的最短距离为: "+distance[i][j]);
System.out.print(j+" ");
while(pre[i][j]!=i) {
System.out.print(pre[i][j]+" ");
j=pre[i][j];
}
System.out.println(i);
}
/**
* 弗洛伊德算法
* 以每一个点为中点(注意是中点)Vj
* 来判断Vi和Vk之间的距离
* Lik=Lij+Ljk>Lik?Lik:Lij+Ljk
* 约定:
* 公示成立的条件
* Vi Vj Vk 是三个不同的点
* 且Vi Vj Vk 中任意两点是连通的
* 距离为0时表示不连通,当然也表示是自己,这个可以通过i j k的值来判断
*
*
*/
public static void floyd() {
int temp=0;
//遍历中点
for(int j=0;j<distance.length;j++) {
//来判断Vi和Vk之间的最短距离
for(int i=0;i<distance.length;i++) {
if(i==j)continue;
for(int k=0;k<distance.length;k++) {
if(i==k||k==j||distance[j][i]==0||distance[j][k]==0)continue;
temp=distance[j][i]+distance[j][k];
if(distance[i][k]==0||temp<distance[i][k]) {
distance[i][k]=temp;
//点i到点k的最短距离,k的前驱结点时,点j到点k的前驱结点
pre[i][k]=pre[j][k];
}
}
}
}
}
/**
* 初始化前驱结点
* 约定:初始化每一个的前驱结点都是自己
* @return
*/
public static int[][] creatPre() {
pre = new int[edges.length][edges.length];
for(int i=0;i<pre.length;i++)
Arrays.fill(pre[i],i);
return pre;
}
/**
* 创建图的邻接矩阵
* 约定
* 可以访问是大于0,大于0表示两个点之间的路径
* 不可以访问为0
* 我们使用下标来代替点(A B C D E F G)的标识
* @return
*/
public static int[][] creatGraph() {
edges= new int[7][7];
// next=new int[edges.length];
// A B C D E F G
edges[0] = new int[] { 0, 5, 7, 0, 0, 0, 2 };
edges[1] = new int[] { 5, 0, 0, 9, 0, 0, 3 };
edges[2] = new int[] { 7, 0, 0, 0, 8, 0, 0 };
edges[3] = new int[] { 0, 9, 0, 0, 0, 4, 0 };
edges[4] = new int[] { 0, 0, 8, 0, 0, 5, 4 };
edges[5] = new int[] { 0, 0, 0, 4, 5, 0, 6 };
edges[6] = new int[] { 2, 3, 0, 0, 4, 6, 0 };
distance=edges.clone();
return edges;
}
}