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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金石不渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值