JDK併發包API-Semaphore使用
阿新 • • 發佈:2022-04-11
一、圖的遍歷概念
定義:從已給的連通圖中某一頂點出發,沿著一些邊訪遍圖中所有的頂點,且使每一個頂點僅被訪問一次,就叫做圖的遍歷,他說圖的基本運算。
遍歷的實質:找每個頂點的鄰接點的過程。
特點:因為圖中是多對多,所有圖中有可能存在迴路,且圖的任一頂點都可能與其他頂點相通,在訪問完某個頂點之後可能沿著某些邊又回到了曾經訪問過的頂點。
避免重複訪問思路:設定輔助陣列visited[n],用來標記每個被訪問過的頂點。
初始狀態visited[i]為0,頂點被訪問可以修改為1,防止多重被訪問
二、圖的遍歷常用演算法
1.深度優先搜尋(Depth_First Search——DFS)
理解:選擇隨機一條路一直走到底,開始回退上一步,判斷還有其他的路嗎,如果有繼續走,直到否則繼續回退,直到回退到開始位置,判斷是否還有未遍歷的,如果沒有表示全部已經遍歷完畢。
選擇的開始不一樣,遍歷結果也不同。類似於樹的先根遍歷
(1)鄰接矩陣表示的無向圖深度遍歷實現:
void DFS(AMGraph G,int V) { // 圖G為鄰接矩陣型別,v為起始頂點 cout << v; visited[v] = true // 訪問第v個頂點,修改輔助陣列表示已被訪問 for(w=0;w<G.vexnum;w++) { // 依次檢測鄰接矩陣v所在的行 if((G.arcs[v][w] != 0) && (!visited[w])) DFS(G,w) // w是v的臨界點,如果w未訪問,則遞迴呼叫DFS } }
稀疏圖適合鄰接表上進行深度遍歷,
稠密圖適合在鄰接矩陣上進行深度遍歷,
(2)非連通圖的遍歷:
通過連通分量 來判斷 是否還有還有 生成樹中的連通圖 未被遍歷
2.廣度優先搜尋(Breadth_First Search——BFS)