图的dfs_欧拉道路(打印欧拉道路的路径)

  欧拉道路和欧拉回路:

  从无向图中的一个结点出发走出一条道路,每条边恰好经过一次,这样的路线称为欧拉道路。
  如果一个无向图是连通的,且最多只有两个奇点(度数为奇数),则一定存在欧拉道路。
  如果有两个奇点,它们必须是起点和,如果奇点不存在,可以从任意点出发,最终一定会回到该点,称为欧拉回路。

参考代码:

import java.util.Stack;

public class Main {
    //在递归回溯时把路径依次存入栈中
    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];
                euler(v);
                //路径信息入栈
                path.push((char) ('A' + u) + "->" + (char) ('A' + v));
            }
        }
    }

    public static void main(String[] args) {
        euler(1);
        while (!path.isEmpty()) {
            System.out.println(path.pop());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值