输出无向图的欧拉道路
七桥问题:七桥问题的百科
欧拉将七桥问题抽象成了图论的问题:能否从无向图中的一个结点出发走出一条道路每条边恰好经过一次,且多有的边都走完?
欧拉道路:从无向图中的一个结点出发走出一条道路每条边恰好经过一次。
简而言之就是可以将所有的边走一遍,且每条边只访问一次。
就是可以"一笔画"。
存在条件:无向图是连通的,有且最多有两个奇点(度数为奇数)
在有向图中,要求最多只能有两个点的入度不能等于出度,而且必须是其中一个点的出度恰好比入度大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));
}
}
}
}