用棧實現圖的深度優先搜尋Java實現
《演算法導論》一書中給出的深度優搜尋是使用遞迴方式實現的。相比較而言,用遞迴的方式實現必用非遞迴方式實現要好理解很多。但是一般而言所有的遞迴方式實現都可以用非遞迴方式實現來代替。這裡用一個棧結構來代替遞迴。初始化時將搜尋的源節點壓入棧中,只要棧不為空,重複以下操作:
(1)彈出棧頂元素結點
(2)將彈出的棧頂結點的所有鄰接後續結點中尚未被發現的結點壓入棧中。
具體程式碼實現如下所示
/** * * 用棧實現深度優先搜尋 * 不能用遞迴 * @param start */ public void DFS(int start){ if(checkVertex(start)){ System.out.println("==============DFS============"); Stack<Integer> stack = new Stack<>(); int[] reached = new int[n+1]; stack.push(start); for(int i =0;i<n+1;i++) reached[i] = 0; reached[start] = 1; Reached[start] = 1;//4 while(!stack.isEmpty()){ int head = stack.pop(); System.out.println(head); GraphChain list = aList[head]; int node = (int) list.pop(); while(!list.isEmpty()){ if(reached[node]==0){ stack.push(node); reached[node] = 1; Reached[node] = 1; } node = (int) list.pop(); } } }else{ System.out.println("所選起始點超出範圍"); } }
此程式碼是基於前面的圖結構的(http://blog.csdn.net/john_bian/article/details/74562477)
相關推薦
用棧實現圖的深度優先搜尋Java實現
《演算法導論》一書中給出的深度優搜尋是使用遞迴方式實現的。相比較而言,用遞迴的方式實現必用非遞迴方式實現要好理解很多。但是一般而言所有的遞迴方式實現都可以用非遞迴方式實現來代替。這裡用一個棧結構來代替
基於圖的深度優先搜尋和廣度優先搜尋java實現
為了解15puzzle問題,瞭解了一下深度優先搜尋和廣度優先搜尋。先來討論一下深度優先搜尋(DFS),深度優先的目的就是優先搜尋距離起始頂點最遠的那些路徑,而廣度優先搜尋則是先搜尋距離起始頂點最近的那些路徑。我想著深度優先搜尋和回溯有什麼區別呢?百度一下,說回
day21 Python 實現的深度優先搜尋實現迷宮演算法
# Python 實現的深度優先搜尋實現迷宮演算法 lookup_path = [] history_path = [] # maze = [[0, 0, 1, 0, 1], [1, 0, 0, 0, 1], [0, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0
day21 Go 實現的深度優先搜尋實現迷宮演算法
# Go 實現的深度優先搜尋實現迷宮演算法 package main import ( "errors" "fmt" "os" ) // 讀取檔案中的資料,使用迴圈生成迷宮圖 func readMazeFile(filename string) [][]int
C++資料結構 23 圖-深度優先搜尋(DFS)
還是按鄰接矩陣的圖,使用深度優先搜尋(DFS:使用堆疊) #include <iostream> #include <stack> #define MAX_VERTS 20 using namespace std; /**使用鄰接矩陣來表示一個圖
無權重最短路徑問題:廣度優先搜尋 & Java 實現
一、什麼是圖 通俗的說,圖就是由 頂點(Vertex) 和 邊(edge) 組成的。一般來說又分為 有向圖 和 無向圖,即頂點到頂點的邊是否是有方向區分的。 二、廣度優先搜尋 1. 概念 廣度優先搜尋(
圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS)及其Java實現
一、背景知識:(1)圖的表示方法:鄰接矩陣(二維陣列)、鄰接表(連結串列陣列【連結串列的連結串列】)。(2)圖的搜尋方法:深度優先搜尋(DFS)和廣度優先搜尋(BFS)。二、圖的搜尋: 1、深度優先搜尋(DFS): (1)用棧記錄下一步的走向。訪問一
Java實現演算法導論中圖的廣度優先搜尋(BFS)和深度優先搜尋(DFS)
對演算法導論中圖的廣度優先搜尋(BFS)和深度優先搜尋(DFS)用Java實現其中的虛擬碼演算法,案例也採用演算法導論中的圖。 import java.util.ArrayList; import java.util.HashMap; import java.util.It
C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS)
C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS) Description 圖採用鄰接矩陣儲存,圖中頂點數為n(0<n<20),頂點資訊為整數,依次為0,1,..,n-1。 編寫函式,輸入圖的型別,0:無向圖,1:有向圖;輸入圖的頂點數、邊數、邊的偶對
C++ 圖的深度優先搜尋和廣度優先搜尋實現
06-圖1 列出連通集 (25 point(s)) 給定一個有N個頂點和E條邊的無向圖,請用DFS和BFS分別列出其所有的連通集。假設頂點從0到N−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。 輸入格式: 輸入第1行給出2個整數N(
我的Java學習-資料結構裡圖的深度優先搜尋演算法
資料結構的學習比較枯燥乏味,尤其是在學習搜尋演算法的時候。在反覆的學習和程式碼的研究後,其實還是能夠在裡面找到些東西讓自己回味。 圖的深度優先搜尋,從圖的某一頂點v出發,遍歷任何一個與v相鄰的沒有被訪問的頂點v2,v3等,再從v2出發,遍歷任何一個與v2相鄰的沒
python實現圖的深度優先搜尋和廣度優先搜尋
1. 深度優先搜尋介紹 圖的深度優先搜尋(Depth First Search),和樹的先序遍歷比較類似。 它的思想:假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。 若此時尚有
圖論入門———深度優先搜尋實現二分圖判定(dfs染色)
這周開始圖論的學習 簡要的瞭解一下圖的概念,以及表示、儲存的方法。 主要就是鄰接矩陣和鄰接表兩種方式 鄰接矩陣就不說了比較好實現 鄰接表則主要用到不同的容器,比如vector。 使用鄰接表的主要思路是對每一個頂點都建立一個vector容器,當它和另一個頂點有邊的
用深度優先搜尋實現全排列
如何模擬出5個人站在一排所有站法?寫出一個5層迴圈好像就可以了,但是如果是n個人呢,我們不可能每次寫一個n層迴圈。但是深度優先搜尋,可以很容易實現這個問題。 輸入:每次給定一個n,代表n個人,n個人編
圖的深度優先搜尋和廣度優先搜尋-python實現
參考程式碼:https://www.cnblogs.com/yupeng/p/3414736.ht
java版無向圖的深度優先搜尋,求連通圖個數
package ctong; import java.util.Arrays; import java.util.Random; public class Graph_DFS { /** * Ctong * @param args */ //建立一個標
圖的深度優先搜尋(鄰接矩陣實現)
晚上聽了一節同學的計算機軟體選修課,剛好講的圖的相關演算法,今天先實現深度優先搜尋吧。 深度優先搜尋,用我的理解,是先設定一個起始點,然後搜尋其鄰接點,用一個visited陣列儲存該點是否未被訪問,若未被訪問,則作為新的起始點,搜尋其鄰接點,這裡就涉及到遞迴演算
圖的遍歷之深度優先搜尋演算法&&廣度優先優先演算法的實現
一.序 和樹的遍歷類似,我們希望從圖中的某一個頂點出發訪問圖中其餘頂點,保證每個頂點只被訪問一次,這一過程叫做圖的遍歷。圖的遍歷演算法是求解圖的連通性問題(最小生成樹),拓撲排序,求關鍵路徑的基礎。 而為了保證同一個頂點不被訪問多次,在遍歷圖的的過程中,必須
深度優先搜尋 走迷宮 java實現
題目如下 : 本題我採用深度優先搜尋的方式解決,建立一個二維的int型別陣列,定義其中的1代表起點,2代表可以走的地方,3代表不可以走的地方,4代表終點,其中由於在搜尋的時候有上下左右四個方向,為了防止做判斷的時候報ArrayIndexOfBoundsException
用鄰接矩陣實現的深度優先遍歷和廣度優先遍歷
using ++ while ext empty type push mat ron 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <queue> 4