2016-12-30 31 views
-3

我爲對稱的無向圖實現了Floyd-Warshall算法。目前,我已經計算出每個連接點的最佳路徑。我的問題是,我想保存收集到累計重量的索引點,以便能夠稍後寫入路線中的點的名稱。我想將它們保存到列表中,但我不知道應將哪些索引寫入函數addDrawPointsToList(int a,int b,int [] [] M)。 a和b是點之間我想保存航點Floyd-Warshall算法 - 最短路徑 - 將路徑索引保存到數組

  • 0 - 在同一節點
  • 1 - 有節點之間的連接
  • X - 沒有連接= 999重量

CODE:

public class FloydWarshallAlg { 
static int[][] P; 
static List<Integer> lista; 
static final int N = 43; 
static final int X = 999; 

public static void main(String[] args) { 

    int M[][] = new int[][]{ 
     {0, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {1, 0, 1, X, X, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, 1, 0, 1, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, 1, X, 0, X, 1, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, 1, 1, X, X, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, 1, X, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, 1, X, X, 0, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, 1, X, X, 1, 0, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, 1, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, 1, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, X, X, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, X, 0, 1, 1, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, 1, 1, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, X, X, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, X, X, X, 0, 1, X, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, X, X, X, 1, 0, 1, X, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, 1, 1, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X, X, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0, 1, 1}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, 0, X}, 
     {X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, 1, X, 0}}; 

    lista = new ArrayList<Integer>(); 
    System.out.println("Main Matrix."); 
    printMatrix(M); 
    System.out.println("Shortest Path Matrix."); 
    printMatrix(FloydAlgo(M)); 
    addDrawPointsToList(3, 12); 
    printList(lista); 
} 

public static List addDrawPointsToList(int a, int b, int[][] M) { 

    return lista; 
} 

public static int[][] FloydAlgo(int[][] M) { 
    for (int i = 0; i < N; i++) { 
     for (int j = 0; j < N; j++) { 
      for (int k = 0; k < N; k++) { 
       // to keep track.; 
       if (M[j][i] + M[i][k] < M[j][k]) { 
        M[j][k] = M[j][i] + M[i][k]; 
       } 
      } 
     } 
    } 
    return M; 
} 

public static void printMatrix(int[][] Matrix) { 
    System.out.print("\n\t"); 
    for (int j = 0; j < N; j++) { 
     System.out.print(j + "\t"); 
    } 
    System.out.println(); 
    for (int j = 0; j < 347; j++) { 
     System.out.print("-"); 
    } 
    System.out.println(); 
    for (int i = 0; i < N; i++) { 
     System.out.print(i + " |\t"); 
     for (int j = 0; j < N; j++) { 
      if (Matrix[i][j] == 999) { 
       System.out.print("X"); 
      } else { 
       System.out.print(Matrix[i][j]); 
      } 
      System.out.print("\t"); 
     } 
     System.out.println(""); 
    } 
    System.out.println("\n"); 
} 

public static void printIntArray(int A[]) { 
    for (int i = 0; i < N; i++) { 
     System.out.print(A[i] + " "); 
    } 
} 

public static void printList(List L) { 
    for (int i = 0; i < L.size(); i++) { 
     System.out.print(L.get(i) + ", "); 
    } 
    System.out.println("\nList size: " + L.size()); 
}} 

我覺得這可能是一個有待解決的小問題,但我是一個新手程序員,我沒有看到解決方案。我會很感激任何建議。 Sry for my english; <

+0

這是一個無法解決或太容易說我真正的解決方案嗎? – CulE

回答

0

我不知道是什麼addDrawPointsToList是應該做的,但在一般情況下,如果你想要從弗洛伊德 - 沃肖爾的路徑,你要記住你計算在i-th步驟是什麼。

如果M[j][i] + M[i][k] < M[j][k],然後從jk使用節點1, ..., i最短路徑經過i。因此,最短路徑可以在從ji以及從jk的最短路徑的最短路徑中分解。假設A[j][k]是這個中間節點。

if (M[j][i] + M[i][k] < M[j][k]) { 
    A[j][k] = i; 
    M[j][k] = M[j][i] + M[i][k]; 
} 

然後拿到路徑從ik

get_path(s, t) { 
    if A[s][t] = s or A[s][t] = t then return [s] 
    // + is here the concatenation 
    return get_path(s, A[s][t]) + get_path(A[s][t], t) 
} 

這是主要的想法,現在你可以編寫Java代碼來模擬這一點。

+0

非常感謝您的回答。在addDrawPointsToList函數中,我想從兩個點a和b之間的最佳路徑長度向列表添加元素(索引)。我認爲我不夠理解你的解決方式。我不知道在哪裏以及如何將點保存到我的路徑列表:( – CulE