《圖論》——深度優先搜尋演算法(DFS)
十大演算法之廣度優先遍歷:
深度優先搜尋遍歷類似於樹的先序遍歷。假定給定圖G的初態是所有頂點均未被訪問過,在G中任選一個頂點i作為遍歷的初始點,則深度優先搜尋遞迴呼叫包含以下操作:
(1)訪問搜尋到的未被訪問的鄰接點;
(2)將此頂點的visited陣列元素值置1;
(3)搜尋該頂點的未被訪問的鄰接點,若該鄰接點存在,則從此鄰接點開始進行同樣的訪問和搜尋。
深度優先搜尋DFS可描述為:
(1)訪問v0頂點;
(2)置 visited[v0]=1;
(3)搜尋v0未被訪問的鄰接點w,若存在鄰接點w,則DFS(w)。
遍歷過程:
DFS在訪問圖中某一起始頂點 v後,由 v 出發,訪問它的任一鄰接頂點 w1;再從 w1出發,訪問與 w1鄰接但還沒有訪問過的頂點 w2;然後再從 w2出發,進行類似的訪問,…如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點 u為止。
接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜尋。重複上述過程,直到連通圖中所有頂點都被訪問過為止。如下圖所示:
在此小編的程式碼主要是根據如下圖編寫個人程式碼:
採用的是存放於鄰接連結串列中
0:代表兩個結點沒有關聯;1:代表兩個結點有關聯
思路:
1、定義vet陣列存放結點資訊;array陣列為鄰接連結串列,初始值為0;ifvisit是判斷結點是否被訪問過,初始值為false
2、從A開始遍歷,找到第一個與之關聯的結點,然後從關聯的結點開始遍歷,直到所有的結點都被訪問過
程式碼如下:
package Graph;
import java.util.ArrayList;
import java.util.List;
/*
* 深度優先遍歷演算法
* DFS
*/
public class DFS {
private static Object[] vet; //定義vet陣列用來存放頂點資訊
private static int[][] array; //定義鄰接矩陣用來存放圖的頂點資訊
private static int vexnum; //存放邊的條數
private static boolean[] ifvisited; //存放節點是否被訪問過
private static List<Object> list = new ArrayList<Object>(); //定義一個臨時的佇列用來存放已經被訪問過的節點
public static void main(String[] args) {
DFS map = new DFS(5); //初始化佇列
Character[] vet = {'A','B','C','D','E'};
map.addVet(vet); //新增頂點
map.addEage(0,1);
map.addEage(0,4);
map.addEage(1,3);
map.addEage(2,3);
map.addEage(2,4);
System.out.println("深度優先遍歷開始...");
visited(0);
ifvisited[0]=true;
map.dfs(0);
}
//深度優先遍歷
private void dfs(int k) {
// TODO Auto-generated method stub
for(int i=0; i< vexnum; i++)
if(array[k][i] == 1 && !ifvisited[i])//判斷是否被訪問過,且其值是否為1
{
ifvisited[i] = true;
visited(i); //新增到被訪問過的節點佇列
for(int j=0; j<vexnum; j++)
{
if(!ifvisited[j] && array[i][j] ==1)
{
ifvisited[j] = true;
visited(j);
dfs(j); //下次迴圈從vet[j]開始迴圈
}
}
}
}
//往臨時佇列裡新增已經訪問過的結點,並輸出
private static void visited(int k) {
// TODO Auto-generated method stub
list.add(vet[k]);
System.out.println(" -> " + vet[k]);
}
//構建鄰接矩陣,儲存邊的資訊
private void addEage(int m, int n) {
// TODO Auto-generated method stub
if(m!=n){
array[m][n] =1;
array[n][m] =1;
}
else
return;
}
//初始化圖的頂點
private void addVet(Character[] vet2) {
// TODO Auto-generated method stub
this.vet = vet2;
}
//圖的初始化
public DFS(int num) {
// TODO Auto-generated constructor stub
vexnum = num; //頂點
vet = new Object[num]; //頂點的資訊
array = new int[num][num]; //邊的資訊
ifvisited = new boolean[num]; //是否被訪問過
for(int i =0 ;i< num; i++) //初始化邊
{
ifvisited[i] = false;
for(int j =0;j<num;j++)
array[i][j]=0;
}
}
}
輸出為:
深度優先遍歷開始...
-> A
-> B
-> D
-> C
-> E
相關文章
- 【演算法】深度優先搜尋(DFS)演算法
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- 深度優先搜尋演算法-dfs講解演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 工作安排(dfs深度優先搜尋)
- 深度優先搜尋(DFS)思路及演算法分析演算法
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- 學習資料結構 - 深度優先搜尋 DFS 記錄資料結構
- 深度和廣度優先搜尋演算法演算法
- dfs深度優先搜尋解決迷宮類問題(遍歷)
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 廣度優先搜尋相關面試演算法總結(非圖論方面)面試演算法圖論
- JAVA圖搜尋演算法之DFS-BFSJava演算法
- 圖論系列之「基於深度優先遍歷的尋路演算法 (Path) 」圖論演算法
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- 深度DFS 和 廣度BFS搜尋演算法學習演算法
- Swift 演算法實戰之路:深度和廣度優先搜尋Swift演算法
- leetcode 刷題之深度優先搜尋LeetCode
- 【知識點】深度優先搜尋 Depth First Search
- DFS深度優先搜尋(3)--hdu2181(哈密頓繞行世界問題)(基礎題)
- 演算法筆記(廣度優先搜尋)演算法筆記
- 演算法競賽——BFS廣度優先搜尋演算法
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- 再來一篇深度優先遍歷/搜尋總結?
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- c++ 廣度優先搜尋(寬搜)C++
- Python 圖_系列之基於鄰接炬陣實現廣度、深度優先路徑搜尋演算法Python演算法
- 834. 樹中距離之和-困難-樹、圖、動態規劃、深度優先搜尋動態規劃
- python實現圖(基於圖的不同儲存方式)的深度優先(DFS)和廣度(BFS)優先遍歷Python
- 一道經典DFS題(深度優先)-演算法程式設計實踐演算法程式設計
- 0演算法基礎學演算法 搜尋篇第二講 BFS廣度優先搜尋的思想演算法
- 小白的深度優先搜尋(Depth First Search)學習日記(Python)Python
- BFS-圖的廣度優先搜尋--鄰接矩陣矩陣
- 圖論系列之「深度優先遍歷及聯通分量」圖論
- 《圖論》——廣度優先遍歷演算法(BFS)圖論演算法