グラフdfs_euler

グラフdfs_euler

/オイラー路とオイラー回路/
/ *

  • 無向グラフのノードから始めて、道路を出て、両側が1回だけ通過します。このようなルートは、オイラーの道路と呼ばれます。
  • 無向グラフが接続されていて、最大で2つの特異点(奇数度)がある場合は、オイラーパスが必要です。
  • 2つの特異点がある場合、それらは開始点である必要があり、
  • 特異点が存在しない場合は、任意のポイントから開始して、最終的にそのポイントに戻ることができます。これは、オイラーの回路と呼ばれます。
  • * /
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());
  }

}

おすすめ

転載: blog.csdn.net/weixin_45952706/article/details/109253011