1. 程式人生 > >基於鄰接表實現的DFS深度優先搜尋

基於鄰接表實現的DFS深度優先搜尋

上一篇文章中說道用鄰接矩陣來實現深度優先搜尋

這裡我們來談用鄰接表來實現深度優先搜尋


鄰接表如下所示:

由於java中對於指標的使用弱化  這裡我用list來模擬連結串列操作

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author zero
 *
 */
public class adjTableDFS {
	private List<Integer> visitList = new ArrayList<Integer>();
	private List<List> nodeList = new ArrayList<List>();
	private Boolean[] visitStatus = {false, false, false, false, false};
	
	public void initNodeList() {
		
		List list = new ArrayList();
		list.add(new Node(2));
		list.add(new Node(4));
		nodeList.add(list);
		
		list = new ArrayList();
		list.add(new Node(3));
		nodeList.add(list);
		
		list = new ArrayList();
		list.add(new Node(0));
		list.add(new Node(1));
		list.add(new Node(4));
		nodeList.add(list);
		
		list = new ArrayList();
		list.add(new Node(0));
		list.add(new Node(4));
		nodeList.add(list);
		
		list = new ArrayList();
		list.add(new Node(0));
		nodeList.add(list);
		
	}
	
	public void dfsSerach(List list) {
		for(int i = 0; i<list.size(); i++) {
			Node node = (Node) list.get(i);
			int num = node.data;
			if(visitStatus[num] == false) {
				visitList.add(node.data);
				visitStatus[num] = true;
				dfsSerach(nodeList.get(num));
			}else {
				
			}
		}
	}
	
	
	public void outSortedResult() {
		System.out.print("The sorted result is : ");
		for(int i=0; i<visitList.size(); i++) {
			System.out.print(visitList.get(i) + "  ");
		}
	}
	
	public void setInitNode(int num) {
		visitList.add(num);
		visitStatus[num] = true;
		dfsSerach(nodeList.get(0));
	}
	
	public static void main(String[] args) {
		adjTableDFS atdfs = new adjTableDFS();
		atdfs.initNodeList();
		atdfs.setInitNode(0);
		atdfs.outSortedResult();
	}
	
	
}

class Node {
	int data;
	public Node(int data) {
		this.data = data;
	}
}

輸出的結果為:

The sorted result is : 0  2  1  3  4 

相關推薦

基於鄰接實現DFS深度優先搜尋

上一篇文章中說道用鄰接矩陣來實現深度優先搜尋 這裡我們來談用鄰接表來實現深度優先搜尋 鄰接表如下所示: 由於java中對於指標的使用弱化  這裡我用list來模擬連結串列操作 import java.util.ArrayList; import java.util.Li

鄰接矩陣實現深度優先遍歷和廣度優先遍歷

using ++ while ext empty type push mat ron 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <queue> 4

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

小朋友學資料結構(16):基於鄰接矩陣的的深度優先遍歷和廣度優先遍歷

觀察下面兩個無向圖: 這兩個圖其實是一樣的,只是畫法不同罷了。第一張圖更有立體感,第二張圖更有層次感,並且把A點置為頂點(事實上圖的任何一點都可以做為頂點)。 一、用陣列來存放頂點 vexs[0] = ‘A’ vexs[1] = ‘B’ vexs[2] = ‘C’ ve

DFS深度優先搜尋

他是從某種狀態開始,不斷的轉移狀態直到無法轉移,然後回退到前一步的狀態,繼續轉移到其他狀態,如此不斷地重複,直到找到那個最終的解---------------挑戰程式設計 1、部分和問題     給定整數A1,A2……An   判斷

DFS深度優先搜尋入門(1)

給定整數a1,a2,a3……an序列,從中選出若干數,使它們的和恰好為k。 限制條件:1<=n<=20 -1e8<=ai<=1e8 -1e8<=k<=1e8 輸入: n=4; a={1,2,4,7} k=13 輸出: YES

資料結構-基於鄰接實現圖的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現

使用 JavaScript 基於鄰接表實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。<!DOCTYPE html> <html lang="en"> <head>

DFS深度優先搜尋(1)--poj3984(基本模板題)

                                                                                                 

DFS深度優先搜尋(入門)

DFS入門(遞迴寫法) 這兩天在學習深度優先搜尋(DFS),感覺DFS比BFS難,一開始主要是標記搞不清楚。DFS在回溯時要取消原先的標記,而BFS不存在回溯也就不存在取消標記這一問題。DFS可以用遞迴來寫,也可以用棧來寫。既然是入門,那我就從遞迴開始學起。下提供一個P

關於鄰接和其深度優先遍歷、廣度優先遍歷的問題

如果有一個鄰接表儲存的圖,以0點出發,深度優先遍歷和廣度優先遍歷。 鄰接表為: [0]->[1]->[5]->[6]->END [1]->[0]->[2]->END [2]->[1]->[3]->END [3]-&

C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋DFS

C語言利用圖的鄰接矩陣的儲存方式實現有向圖和無向圖的深度優先搜尋(DFS) Description 圖採用鄰接矩陣儲存,圖中頂點數為n(0<n<20),頂點資訊為整數,依次為0,1,..,n-1。 編寫函式,輸入圖的型別,0:無向圖,1:有向圖;輸入圖的頂點數、邊數、邊的偶對

C 試基於圖的深度優先搜尋策略寫一演算法 判別以鄰接方式儲存的有向圖中是否存在由頂點 vi到頂點 vj的路徑 i≠j 。

嚴蔚敏 資料結構 7.22 給大佬跪了,這個是要返回的,但是還要兼顧頂點上連線的其他節點,不能一個不行就不行,所以走的路徑只返回走通的,走不通的略過,直到最後,能走到最後就說明根本沒有通的路徑,就這樣。 也可以把這個點上的所有連線點用深度遍歷走一次,然後看看記錄

鄰接實現--圖的深度優先遍歷DFS和廣度優先遍歷BFS

          圖論中一個基本的概念就是遍歷。就是訪問到圖的每一個頂點,同時每個頂點只訪問一次。           DFS和BFS的概念和思路網上說明的很詳細了。但是網上很多程式碼實現有缺陷,基本都沒有考慮圖不連通的情況,比如某個頂點A和其它任何一個頂點都不關聯,

圖的深度優先遍歷DFS鄰接實現)c語言

要實現該演算法首先要知道鄰接表的概念。鄰接表是一種常用的圖的儲存結構,它的結構特點是:頂點由一個一維陣列儲存;鄰接點用連結串列儲存相比於單純用陣列實現的鄰接矩陣,鄰接表可以避免空間浪費其圖解如下:firstedge指向邊表第一個結點。邊表的adjvex的值代表與V0頂點有邊的

深度優先搜尋DFS——圖鄰接表示

作為圖的一個基本演算法,DFS應用很廣,可以推廣出很多實用的演算法。下面貼出一個比較常用的用鄰接表表示的圖DFS。 /* 圖鄰接表表示DFS input: 1 7 A 1 5 B 2 4 3 C 2 4 2 D 3 6 5 2 E 3 7 4 1 F 1 4 G 1 5

深度優先搜尋鄰接

#include <iostream> #include <cstdio> #include <vector> using namespace std; struct Node { //v 代表編號 //w 代表權值 int v,w;

鄰接建立無向圖,深度優先搜尋遍歷輸出

1 #include<stdio.h> 2 #include<string.h> 3 #include <iostream> 4 #include<algorithm> 5 using namespace std; 6 #define MVNu

基於鄰接儲存的圖的深度優先和廣度優先遍歷

一.深度優先遍歷是連通圖的一種遍歷方法:   設x是當前被訪問頂點,在對x做過訪問標記後,選擇一條從x出發的未檢測過的邊(x, y)。若發現頂點y已訪問過,則重新選擇另一條從x出發的未檢測過的邊,否則沿邊(x,y) 到達未曾訪問過的y,對y訪問並將其標記為已訪問過;

DFS深度優先搜尋)的非遞迴實現

突然想起來搜尋是屬於圖論的,那麼在解決圖論的過程中把搜尋解決掉。沒想到非遞迴實現一下就搞了兩天。雖然有些疑問還沒有解決,但感覺已經可以寫總結了,與其說總結,不如說一次嘗試的記錄(因為有個題最後還是TLE嘛)。(求規範程式碼!!!@嘯爺) 眾所周知,DFS的常規寫法是遞迴實現,但遞迴普遍慢所以可