圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(v
)表示,而物件之間的關係或者關聯則通過圖的邊(e
)來表示。 圖可以分為有向圖和無向圖,一般用g=(v,e)
來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中,最初需要接觸的就是圖的遍歷演算法,根據訪問節點的順序,可分為廣度優先搜尋(bfs
)和深度優先搜尋(dfs
)。
廣度優先搜尋(bfs) 廣度優先搜尋在進一步遍歷圖中頂點之前,先訪問當前頂點的所有鄰接結點。 a .首先選擇乙個頂點作為起始結點,並將其染成灰色,其餘結點為白色。 b. 將起始結點放入佇列中。 c. 從佇列首部選出乙個頂點,並找出所有與之鄰接的結點,將找到的鄰接結點放入佇列尾部,將已訪問過結點塗成黑色,沒訪問過的結點是白色。如果頂點的顏色是灰色,表示已經發現並且放入了佇列,如果頂點的顏色是白色,表示還沒有發現 d. 按照同樣的方法處理佇列中的下乙個結點。 基本就是出隊的頂點變成黑色,在佇列裡的是灰色,還沒入隊的是白色。 用一副圖來表達這個流程如下:
1.初始狀態,從頂點1開始,佇列=
2.訪問1的鄰接頂點,1出隊變黑,2,3入隊,佇列=
3.訪問2的鄰接結點,2出隊,4入隊,佇列=
4.訪問3的鄰接結點,3出隊,佇列=
5.訪問4的鄰接結點,4出隊,佇列=
從頂點1開始進行廣度優先搜尋:
初始狀態,從頂點1開始,佇列=
訪問1的鄰接頂點,1出隊變黑,2,3入隊,佇列=
訪問2的鄰接結點,2出隊,4入隊,佇列=
訪問3的鄰接結點,3出隊,佇列=
訪問4的鄰接結點,4出隊,佇列= 結點5對於1來說不可達。 上面的圖可以通過如下鄰接矩陣表示:
1bfs核心**如下:int maze[5][5] =,
3 ,
4 ,
5 ,
6
7 };
1 #include 2 #include 31.初始狀態,從頂點1開始#define n 5
4using
namespace
std;
5int maze[n][n] =,
7 ,
8 ,
9 ,
10
11};
12int visited[n + 1] = ;
13void bfs(int
start)
1430}31
}32}33
intmain()
3441
return0;
42 }
2.依次訪問過頂點1,2,3後,終止於頂點3
3.從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5
4.從頂點5回溯到頂點2,並且終止於頂點2
5.從頂點2回溯到頂點1,並終止於頂點1
6.從頂點4開始訪問,並終止於頂點4
從頂點1開始做深度搜尋:
初始狀態,從頂點1開始
依次訪問過頂點1,2,3後,終止於頂點3
從頂點3回溯到頂點2,繼續訪問頂點5,並且終止於頂點5
從頂點5回溯到頂點2,並且終止於頂點2
從頂點2回溯到頂點1,並終止於頂點1
從頂點4開始訪問,並終止於頂點4
上面的圖可以通過如下鄰接矩陣表示:
1dfs核心**如下(遞迴實現):int maze[5][5] =,
3 ,
4 ,
5 ,
6
7 };
1 #include 2非遞迴實現如下,借助乙個棧:#define n 5
3using
namespace
std;
4int maze[n][n] =,
6 ,
7 ,
8 ,
9
10};
11int visited[n + 1] = ;
12void dfs(int
start)
1320 cout << start << "";
21}22int
main()
2330
return0;
31 }
1 #include 2 #include 3#define n 5
4using
namespace
std;
5int maze[n][n] =,
7 ,
8 ,
9 ,
10
11};
12int visited[n + 1] = ;
13void dfs(int
start)
1432}33
if (!is_push)
343839}
40}41int
main()
4249
return0;
50 }
dfs 深搜 模板
關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用的搜尋分支。有可行性剪枝和最優性剪枝兩種。int mx 4 向上下左右四個方向移動 0,1 0,1 1,0 1,0 int my 4 bool check int x,int y 判斷是否滿足條件的子...
深搜DFS和廣搜BFS
一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優解,必需記實並完成全數搜尋,故一般情況下,深搜需要很是高效的剪枝 優化 像搜尋最短路徑這些的很顯著是用廣...
小貓爬山(DFS深搜)
翰翰和達達飼養了n只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了 嗚咕 翰翰和達達只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n只小貓的重量分別是c1 c2 cn。當然,每輛纜車上的小貓的重量之和不能超過w。每租用一輛纜車,翰翰和達...