Java实现图的dfs应用之欧拉道路问题 七桥问题 欧拉道路,欧拉回路的存在条件

输出无向图的欧拉道路

七桥问题:七桥问题的百科

欧拉将七桥问题抽象成了图论的问题:能否从无向图中的一个结点出发走出一条道路每条边恰好经过一次,且多有的边都走完?

欧拉道路:从无向图中的一个结点出发走出一条道路每条边恰好经过一次。
简而言之就是可以将所有的边走一遍,且每条边只访问一次。
就是可以"一笔画"。

存在条件:无向图是连通的,有且最多有两个奇点(度数为奇数)
在有向图中,要求最多只能有两个点的入度不能等于出度,而且必须是其中一个点的出度恰好比入度大1(起点),另一个的入度比出度大1(终点)

如果要打印欧拉道路,则一定要选一个度数为奇数的结点作为起点

如果存在两个奇点,则这两个点一定是这条欧拉道路的起点和终点

欧拉回路:不能一笔画。如果奇点不存在,则从任意结点出发,最终一定会回到该点

一下代码实现了输出一个无向图的欧拉道路


import java.util.Stack;

public class EulerRoad {

	//存储路径的栈
	static Stack<String> path=new Stack<>();
	//图的邻接矩阵,0:没有路 1:一条路 2:有两条路
	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;
	//visited 数组
	//注意,这个vis数组是标记边的访问状态而不是结点的,所以是二维的
	//因为在欧拉道路中,结点是可以被多次访问的
	private static int visited[][]=new int [4][4];
	
	public static void main(String[] args) {
		//将度数为奇数的结点作为起点
		euler(2);
		while(!(path.isEmpty()))
			System.out.println(path.pop());
	}

	private static void euler(int u) {
		//挨个访问该顶点的邻居
		for(int v=0;v<n;v++)
		{
			//有边,且访问次数少于连接数
			if(graph[u][v]>0&&visited[u][v]<graph[u][v])
			{
				visited[u][v]++;
				visited[v][u]++;
				euler(v);
				path.push((char)('A'+u)+"->"+(char)('A'+v));
			}
		}					
	}
	
}

发布了24 篇原创文章 · 获赞 10 · 访问量 1280

猜你喜欢

转载自blog.csdn.net/qq_41625102/article/details/104521261