圖的dfs_euler

唥小雨發表於2020-10-27

圖的dfs_euler

/尤拉道路和尤拉回路/
/*

  • 從無向圖中的一個結點出發走出一條道路,每條邊恰好經過一次,這樣的路線稱為尤拉道路
  • 如果一個無向圖是連通的,且最多隻有兩個奇點(度數為奇數),則一定存在尤拉道路。
  • 如果有兩個奇點,它們必須是起點和,
  • 如果奇點不存在,可以從任意點出發,最終一定會回到該點,稱為尤拉回路
  • */
import java.util.Stack;


public class 圖的dfs_euler {
  static Stack<String> path = new Stack<>();
  //圖的鄰接矩陣
  private static int[][] graph = {
      {0, 1, 2, 1},
      {1, 0, 0, 0},
      {2, 0, 0, 1},
      {1, 0, 1, 0}
  };
  // 節點數
  private static final int n = 4;
  //標記邊的訪問情況,因為通路是雙向的,所以用二維陣列
  private static int[][] vis = new int[n][n];

  /**
   *
   * @param u 現在訪問的頂點
   */
  static void euler(int u) {
    //其他頂點
    for (int v = 0; v < n; v++) {
      //有邊,且訪問次數少於連線數
      if (graph[u][v] > 0 && vis[u][v] < graph[u][v]) {
        //路是雙向的
        vis[u][v]++;
        vis[v][u]++;
        //v作為新的起點,遞迴
        euler(v);
        //已走u->v,將這一步走法加入棧中
        path.push((char) ('A' + u) + "->" + (char) ('A' + v));
      }
    }
  }

  public static void main(String[] args) {
    euler(2);
    while (!path.isEmpty())
      System.out.println(path.pop());
  }

}

相關文章