七桥问题和欧拉道路
文章目錄
- 問(wèn)題的引出
- 基本定義和規(guī)律
- 實(shí)戰(zhàn)演練:
問(wèn)題的引出
- ?柯尼斯堡七橋問(wèn)題( Seven Bridges of Konigsberg )是圖論中的著名問(wèn)題。這個(gè)問(wèn)題是基于一個(gè)現(xiàn)實(shí)生活中的事例:當(dāng)時(shí)東普魯士柯尼斯堡(今日俄羅斯加里寧格勒)市區(qū)跨普列戈利亞河兩岸,河中心有兩個(gè)小島。小島與河的兩岸有七條橋連接。在所有橋都只能走一遍的前提下,如何才能把這個(gè)地方所有的橋都走遍?
- ?能否從無(wú)向圖中的一個(gè)結(jié)點(diǎn)出發(fā)走出一條道路,每條邊恰好經(jīng)過(guò)一次,這樣的路線稱為歐拉道路(一筆畫(huà) )。
基本定義和規(guī)律
- ?如果一個(gè)無(wú)向圖是連通的,且最多只有兩個(gè)奇點(diǎn)(度數(shù)為奇數(shù)),則一定存在歐拉道路
- ?如果有兩個(gè)奇點(diǎn),它們必須是起點(diǎn)和終點(diǎn)
- ?如果奇點(diǎn)不存在,可以從任意點(diǎn)出發(fā),最終一定會(huì)回到該點(diǎn) ,稱為歐拉回路
- ?對(duì)于有向圖,歐拉道路存在的充要條件是:最多只能有兩個(gè)點(diǎn)的入度不等于出度,而且必須是其中一一個(gè)點(diǎn)的出度恰好比入度大1 (起點(diǎn)) ,另一個(gè)的入度比出度大1 (終點(diǎn))
實(shí)戰(zhàn)演練:
打印出下圖的歐拉道路的走法
解題思路:
??用鄰接矩陣表示圖,由于要形成歐拉道路,所以應(yīng)該從度數(shù)為奇數(shù)的節(jié)點(diǎn)出發(fā);開(kāi)始進(jìn)行深搜,在深搜的過(guò)程中做標(biāo)記哪些邊走過(guò);可以另用一個(gè)相同的鄰接矩陣做標(biāo)記,也可以對(duì)原來(lái)的鄰接矩陣進(jìn)行修改。
代碼如下:
import java.util.ArrayList; import java.util.List; import java.util.Stack;public class 歐拉道路 {//圖的鄰接矩陣private static int[][] graph = {{0,1,2,1},{1,0,0,0},{2,0,0,1},{1,0,1,0},};private static int n = 4; //節(jié)點(diǎn)數(shù)private static List<String> l = new ArrayList<String>();//因?yàn)樯钏褧r(shí)是先存儲(chǔ)后面的路徑,所以用棧進(jìn)行存儲(chǔ)private static Stack<String> path = new Stack<String>();public static void main(String[] args) {//從節(jié)點(diǎn)數(shù)為奇數(shù)的開(kāi)始進(jìn)行深搜,C的度數(shù)為3,所以從C節(jié)點(diǎn)開(kāi)始深搜dfs(2);while(!path.isEmpty()){System.out.println(path.pop());}}private static void dfs(int i) {//尋找相鄰的節(jié)點(diǎn),且邊沒(méi)有使用過(guò)for(int j=0; j<n; j++){if(graph[i][j]>0){ //右邊且沒(méi)有使用過(guò)//減去使用過(guò)的邊graph[i][j]--;graph[j][i]--;dfs(j);//添加走過(guò)的路徑必須放到深搜后,當(dāng)深搜到終點(diǎn)時(shí),反向的保存路徑。//如果在深搜前添加路徑,可能會(huì)將錯(cuò)誤的路徑給添加進(jìn)去,//因?yàn)楫?dāng)走到一個(gè)只有一條邊的節(jié)點(diǎn)時(shí),會(huì)回溯path.push((char)('A'+i) +"->" + (char)('A'+j));}}} }總結(jié)
- 上一篇: 电场强度 高斯定理 习题
- 下一篇: makefile通配符