图的dfs_euler

图的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());
  }

}

©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页