1. 程式人生 > >深度優先搜尋DFS C++實現

深度優先搜尋DFS C++實現

使用鄰接矩陣+棧的形式實現深度優先搜尋,棧中儲存訪問過的節點,後進先出的結構可以讓他回退搜尋未訪問過的節點。

//DFS,使用 鄰接矩陣+棧 實現
#include <iostream>
#include <stack>

using namespace std;

#define MAX_VERTS 20

class Vertex
{
public:
	Vertex(char lab)
	{
		Label = lab;
		wasVisited = false;
	}
public:
	bool wasVisited;
	char Label;
};

class Graph
{
public:
	Graph();
	~Graph();
	void addVertex(char lab);
	void addEdge(int start, int end);
	void printMatrix();
	void showVertex(int v);
	void DFS();
private:
	Vertex* vertexList[MAX_VERTS];
	int nVerts;
	int adjMat[MAX_VERTS][MAX_VERTS];

	int getAdjUnvisitedVertex(int v);
};

Graph::Graph()
{
	nVerts = 0;
	for (int i = 0; i < MAX_VERTS; i++)
	{
		for (int j = 0; j < MAX_VERTS; j++)
		{
			adjMat[i][j] = 0;
		}
	}
}

Graph::~Graph()
{
	//delete[] vertexList;
}
//新增頂點
void Graph::addVertex(char lab)
{
	vertexList[nVerts++] = new Vertex(lab);
}
//新增邊
void Graph::addEdge(int start, int end)
{
	adjMat[start][end] = 1;
	adjMat[end][start] = 1;
}

void Graph::printMatrix()
{
	for (int i = 0; i < nVerts; i++)
	{
		for (int j = 0; j < nVerts; j++)
		{
			cout << adjMat[i][j] << " ";
		}
		cout << endl;
	}
}
//顯示頂點標籤
void Graph::showVertex(int v)
{
	cout << vertexList[v]->Label << " ";
}

//獲得未訪問過的下一個頂點
int Graph::getAdjUnvisitedVertex(int v)
{
	for (int j = 0; j < nVerts; j++)
	{
		//鄰接的並且沒被訪問過
		if ((adjMat[v][j] == 1) && (vertexList[j]->wasVisited == false))
			return j;
	}

	return -1;
}
//深度優先搜尋
void Graph::DFS()
{
	stack<int> gStack;
	vertexList[0]->wasVisited = true;
	showVertex(0);
	//要把訪問過的頂點壓入棧中
	gStack.push(0);
	int v;
	while (gStack.size() > 0)
	{
		//訪問當前頂點的下一個
		v = getAdjUnvisitedVertex(gStack.top());
		//如果沒找到就利用棧向回找
		if (v == -1)
			gStack.pop();
		else
		{
			vertexList[v]->wasVisited = true;
			showVertex(v);
			gStack.push(v);
		}
	}
	cout << endl;
	//為了下一次搜尋再把wasVisited變成false
	for (int j = 0; j < nVerts; j++)
		vertexList[j]->wasVisited = false;
}

int main()
{
	Graph g;
	g.addVertex('A');
	g.addVertex('B');
	g.addVertex('C');
	g.addEdge(0, 1);
	g.addEdge(0, 2);
	
	g.printMatrix();

	g.DFS();

	system("pause");
	return 0;
}

相關推薦

深度優先搜尋DFS C++實現

使用鄰接矩陣+棧的形式實現深度優先搜尋,棧中儲存訪問過的節點,後進先出的結構可以讓他回退搜尋未訪問過的節點。//DFS,使用 鄰接矩陣+棧 實現 #include <iostream> #include <stack> using namespace

C++資料結構 23 圖-深度優先搜尋(DFS)

還是按鄰接矩陣的圖,使用深度優先搜尋(DFS:使用堆疊)   #include <iostream> #include <stack> #define MAX_VERTS 20 using namespace std; /**使用鄰接矩陣來表示一個圖

實現深度優先搜尋DFS(以迷宮解救為例子)

演算法描述:給定開始點座標(x,y) 和終點座標(p,q),在一個二維數組裡面,其中1代表障礙物,0則沒有。求開始到終點的最短距離。 程式碼如下: MIN = 9999999 a = [[0

演算法----圖的遍歷(深度優先搜尋DFS、廣度優先搜尋BFS)

圖的遍歷的定義:從圖的某個頂點出發訪問圖中所有的點,且每個頂點僅被訪問一次。 深度優先搜尋DFS: 準備:指定的起始點和終點,確定好當前點與鄰接點之間的偏移值、結束搜尋的條件、符合訪問的點所需條件、回溯處理; (1)若當前點的鄰接點有未被訪問的,則選一個進行訪問; (2)若當前點的鄰接點都不符合訪問條

深度優先搜尋DFS(洛谷)

ACM題集:https://blog.csdn.net/weixin_39778570/article/details/83187443 P1219 八皇后 題目:https://www.luogu.org/problemnew/show/P1219 題意:N皇后問題求解個數,部分輸出

演算法7-4,7-5:圖的遍歷——深度優先搜尋c語言)

[提交] [統計] [提問] 題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都

三、【圖演算法】深度優先搜尋(DFS)

圖演算法是個龐大的家族,其中大部分成員的主體框架都可以歸結於圖的遍歷。圖的遍歷需要訪問所有頂點一次且僅 一次,此外,圖遍歷同時還要訪問所有的邊一次且僅一次。經過一次遍歷,樹邊的頂點共同構成了原圖的一顆遍歷樹。 為防止對頂點的重複訪問,在遍歷的過程中,需要動態地設定各頂點的不同狀態,並且隨著遍

寬度優先搜尋BFS 和深度優先搜尋DFS的比較。。

首先簡單介紹下題目。就是有9個掛鐘,時間只存在3,6,9,12 這4種狀態對應的 狀態編號是 1,2,3,0,然後給你9種操作時鐘的方式,每次可以事操作的時鐘狀態編號+1,如果編號到了4,就是表示為0。目標就是把9個鬧鐘全部變為0狀態。題目大致是這個意思,不懂的可以看看上

深度優先搜尋(DFS)與廣度優先搜尋(BFS)

深度優先搜尋的基本模型 void dfs(int step) { 判斷邊界 嘗試每一種可能 for(int i=0; i<n; i++) { 繼續下一步 dfs(step+1); } 返回 } 輸出一個

深度優先搜尋dfs之1到n的全排列(收藏)

/******** *給你一個數n,輸出1到n的全排列 *深度優先搜尋 ********/#include <stdio.h>#include <stdlib.h>int book[10], a[10], n;  void dfs(int step) 

廣度優先搜尋BFS-C實現、思路、解析和總結

廣度優先搜尋BFS 基本簡介 實現思路 實現效果 C程式碼實現 廣度優先搜尋BFS 基本簡介 對於每一個點,找到這個點能夠直接連通的點,只做廣度上的搜尋而不做深度的搜尋,在這個點的所有廣度都搜尋完成後,再擴充套件、深入到下一個深度進行廣度搜

藍橋杯 ADV-188 演算法提高 排列數(java) 深度優先搜尋 DFS

 演算法提高 排列數   時間限制:1.0s   記憶體限制:256.0MB 問題描述   0、1、2三個數字的全排列有六種,按照字母序排列如下:   012、021、102、120、201、210   輸入一個數n   求0~9十個數的全排列中的第n個(

深度優先搜尋(DFS)詳解

深度優先搜尋是一種怎樣的方法?深度優先搜尋所使用的策略就如其名字一樣,只要可能,就在圖中儘量的深入。深度優先搜素總是對最近才發現的結點v的出發邊進行探索,直到該結點的所有出發邊都被發現為止。一旦結點v的所有出發邊都被發現,搜尋則回溯到v的前驅結點(v是經過該點才被發現的),

leetcode 140. Word Break II 深度優先搜尋DFS + 很棒的動態規劃DP 做法 + 記錄前驅節點

Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add spaces in s to construct a sentence

LeetCode演算法練習——深度優先搜尋 DFS

很久都沒有刷LeetCode了,上次LeetCode已經快是兩個月之前的事情了。現在繼續。之前中級演算法差不多刷完了,這次專練資料結構。這一篇主要是dfs題目,標識為簡單的題目一般就跳過了,主要刷中等與困難題。 LeetCode上分類為dfs的題目大多數與

深度優先搜尋DFS( 遞迴+非遞迴)

參考演算法導論第三版 p349 /* dfs搜尋 - 鄰接表 */ #include <cstdio> #include <vector> #include <stack> using std::vector; using std::

演算法: 無向圖的深度優先搜尋(dfs)和廣度優先搜尋(bfs)

更新:DFS和BFS是應用廣泛而實現簡便的演算法,但有2個小點需要稍稍注意一下。 對於DFS來說,可以用遞迴,也可以用迭代。對於一張較大的圖,迭代是優於遞迴的,因為遞迴要維護一個函式呼叫棧。小心stackoverflow喔。 對於BFS來說,實現起來需要注意

深度優先搜尋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

圖的基本演算法--深度優先搜尋(dfs) 和 廣度優先搜尋(bfs)

# 圖 # 0 # / | \ # 1 2 - 4 # / # 3 m = 999999 # 代表沒有連線 a =

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

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