在前面的文章《所有节点对的最短路径问题》中,我们介绍了用于稀疏图的Johnson算法,由于代码比较长,我们将其单独放在一篇文章之中。
Johnson算法的时间复杂度在使用二叉堆作为最小优先队列的情况下为O((V^2 + EV)lgV);在使用斐波那契堆作为最小优先队列的时候为O(V^2lgV + VE),因此尤其是在稀疏图的情况下,其效率要比Floyd-Warshall高。
下面给出Java实现的代码:
import java.util.*;
public class Johnson{
static final int MAX = 20; //最大点数
static int[][] g;
static int[] h = new int[MAX];
// static LinkedList<Elem> S = new LinkedList<Elem>();
static PriorityQueue<Elem> Q = new PriorityQueue<Elem>(); //Q = V-S
static ArrayList<Elem> nodes = new ArrayList<Elem>();
static int[][] D;
static int ver; //节点数
static int edge; //边数
static final int BELLMAN_FORD = 1;
static final int DIJKSTRA = 2;
/************全局数据结构****************/
static class Elem implements Comparable<Elem>
{
public int s; //节点编号
public int d; //与源节点距离
public Elem(int s,int d){
this.s = s