Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正確处理有向图或负权的最短路径问题。当然这个问题也可以对每个顶点使用单源最短路径算法来求解,但Floyd-Warshall算法的形式更为简单。在此算法中采用图的邻接矩阵方式计算和理解起来会很简单。
Floyd-Warshall算法的原理是动态规划:
设D i,j,k为从i到j的只以(1..k)集合中的节点为中间節点的最短路径的长度。
1.若最短路径经过点k,则D i,j,k = D i,k,k ? 1 + D k,j,k ? 1;
2.若最短路径不经过点k,则D i,j,k = D i,j,k ? 1。
因此,D i,j,k = min(D i,k,k ? 1 + D k,j,k ? 1,D i,j,k ? 1)。
java的实现如下(以有向图为例,图结构采用邻接矩阵):
还是先定义顶点和边:
public class Edge {
int weight;
Vertex start;
Vertex end;
public Edge(Vertex a, Vertex b, int w) {
start = a;
end = b;
weight = w;
}
}
public class Vertex {
String key;
public Vertex(String k) {
key = k;
Floyd_Warshall.i++;
Floyd_Warshall.vertexList.add(this);
}
}
然后是Floyd_Warshall算法的核心:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;