所有对最短路径问题

时间:2017-03-06 15:26:21

标签: java arrays algorithm adjacency-matrix floyd-warshall

我编写了这个程序,它使用邻接矩阵实现了包含100个节点的图形。我还使用了Floyd-Warshall算法来查找所有100个节点的所有对最短路径。现在,我想将100 x 100矩阵缩小为10 x 10矩阵,该矩阵仅包含public static final int A = 100 ... public static final int W = 66指定的10个索引的所有对最短路径。我应该如何压缩数组?我已经开始构建一个名为arrayCondenser的新方法,但是有更简单的方法吗?

public class AdjacencyMatrix
{       
    public static final int NUM_NODES = 100;
    public static final int INF = 99999;

    public static final int A = 20;
    public static final int B = 18;
    public static final int C = 47;
    public static final int D = 44;
    public static final int E = 53;
    public static final int F = 67;
    public static final int G = 95;
    public static final int H = 93;
    public static final int I = 88;
    public static final int W = 66;

    public static boolean even(int num) 
    {
        return num%2==0;
    }

    public static boolean odd(int num) 
    {
        return num%2==1;
    }

    public static void initialize(int [][] adjMat, int N) 
    {
        for(int i = 0; i < N; i++)
            for(int j = 0; j <N; j++)
                adjMat[i][j]=INF;

        for(int x = 0; x<N; x++)
        {
            int row = x/10;
            int column = x%10;

            if (even(row)) {
                if (column!=9)
                    adjMat[x][x+1]=1;
            }
            if (odd(row)) {
                if (column!=0)
                    adjMat[x][x-1]=1;
            }
            if (even(column)){
                if (row!=9)
                    adjMat[x][x+10]=1;
            }
            if (odd(column)) {
                if (row!=0)
                    adjMat[x][x-10]=1;
            }
        }
    }

    public static int[][] floydWarshall(int[][] adjMat, int N)
    {
        adjMat = new int[N][N];
        initialize(adjMat, N);

        for(int k = 0; k < N; ++k) 
        {
           for(int i = 0; i < N; ++i) 
           {
              for(int j = 0; j < N; ++j) 
              {
                 adjMat[i][j] = Math.min(adjMat[i][j], adjMat[i][k] +   adjMat[k][j]);
              }
           }
        }

        return adjMat;
    }

    public static int[][] arrayCondenser(int[][] adjMat, int N)
    {
        int[] array = {A,B,C,D,E,F,G,H,I,W};
        adjMat = floydWarshall(adjMat, N);




        return adjMat;
    }

    public static void printGrid(int[][] adjMat)
    {
        for (int i=0; i<NUM_NODES; ++i)
        {
           for (int j=0; j<NUM_NODES; ++j)
           {
               if (adjMat[i][j]==INF)
                   System.out.printf("%5s", "INF");
               else
                   System.out.printf("%5d",adjMat[i][j]);
           }
           System.out.println();
        }
    }

    public static void main(String[] args)
    {

        int adjMat[][] = new int[NUM_NODES][NUM_NODES];
        adjMat = floydWarshall(adjMat, NUM_NODES);

        printGrid(adjMat);            

        System.out.println();
    }
}

1 个答案:

答案 0 :(得分:1)

我不认为你想做的事情是可能的。 Floyd-Warshall算法使用先前的顶点迭代地(如您所知)考虑每个最短路径。删除顶点(以及代理,边缘)后,您将删除最短路径的有效方案,可能包括也可能不包括这些顶点。

更改正在使用的顶点集后,必须重新计算新图的最短路径。否则,您基本上必须跟踪每个路径,以便在删除顶点时,可以删除使用这些顶点的任何路径 - 从而获得新的最短路径。