Introduction:
七桥问题:
有一条名为Pregel的河流经过Konigsberg城。城中有7座桥,把河中的两个岛与河岸连接起来。当地居民热衷于一个难题:是否存在一条路线,可以不重复地走遍7座桥。该问题由欧拉首先提出。
问题的核心:能否从无向图的一个结点出发走出一条道路,每条边恰好经过一次 -> 欧拉道路
欧拉道路:如果一个图只是一个形成一个连通连通所有节点的链,且每个点只走一次,则成为欧拉道路。
欧拉回路:假设有图G,若图G中的一个回路恰通过G中每条边一次,则称该回路为欧拉回路。
在欧拉道路中,“进”和“出”是相对应的 -- 除了起点和终点外,其他点的“进出”次数应该相等。换句话说,其他点的度数(degree)应该是偶数。但在七桥问题中,所有点的进出度数是奇数,因此不可能存在欧拉道路。(节点的入度是指进入该节点的边的条数;
节点的出度是指从该节点出发的边的条数)
所以,对于无向图来说,满足欧拉回路的条件是:
1. 连通 2. 有且只有两个奇点 a. 两个奇点:欧拉道路 b. 零个奇点:欧拉回路
如果有两个奇点,则必须从一个奇点出发,另一个奇点终止。(欧拉道路)如果奇点不存在,则可以从任意点出发,最终一定会回到该点。(欧拉回路)
关于有向图的结论(欧拉道路):在一个连通图中,最多只能有两个点的入度不等于出度,而且必须是其中一个点的出度比入度大1(把它作为起点),另一个的入度比出度大1(把它作为终点)
//G is the graph; vis tells us whether a path has been visited; n is the number of nodes
public static void eulerPath(int u) {
for (int v = 0; v < n; v++) {
if (G[u][v] && vis[u][v] == 0) {
vis[u][v] = 1;
//Since this is a undirected graph, severe the connection at both directions
vis[u][v] = vis[v][u];
eulerPath(v);
System.out.println(u + " " + v + "\n");
}
}
}