【图的dfs】—— 欧拉道路

在这里插入图片描述
能否从无向图中的一个结点走出一条道路,每条边恰好经过一次,这样的路线称为欧拉道路(可一笔画搞定)。
欧拉回路:不能一笔画搞定。
如果一个无向图是连通的 且 无向图中奇点的个数为 1 或 2,则一定存在欧拉道路。
注意:要以度数为奇数的结点作为起点!!

import java.util.Stack;
public class Main{
	static Stack<String> path = new Stack<>();
	static int [][] graph = {
	    {0,1,2,1},
		{1,0,0,0},
		{2,0,0,1},
		{1,0,1,0}};
	
	//节点数
	static int n = 4;
	//标记函数
	static int[][] vis = new int[n][n];  // vis[u][v]代表u,v两点间的已访问次数
	

	private static void dfs(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作为新的起点,递归
				dfs(v);
				path.push((char)('A'+u)+ "->" + (char)('A'+v));		
			}
		}	
	}
	
	public static void main(String[] args) {
		dfs(1);
		while(!path.isEmpty())
			System.out.println(path.pop());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值