資料結構與演算法(bfs與dfs)

2021-10-02 07:22:32 字數 2828 閱讀 2003

引言:經過上一次的學習,我們明白了圖的基本操作。這一次,我們學習圖的兩種基本演算法——bfs與dfs。

2.bfs演算法

後記介紹:dfs演算法也叫深度優先搜尋,核心思想是從某一位置或者狀態出發,進行搜尋,直到找到為止。形象的可以認為是所有的可能都走一邊,既暴力。

深度優先遍歷圖的方法是,從圖中某頂點v出發:

(1)訪問頂點v;

(2)依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;

(3)若此時圖中尚有頂點未被訪問,則從乙個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。

void

dfs(寫入的引數)

迴圈遍歷每一種可能,進行相關的操作 }

}

排列數字

給定乙個整數n,將數字1~n排成一排,將會有很多種排列方法。

現在,請你按照字典序將所有的排列方法輸出。

input

共一行,包含乙個整數n。

output

按字典序輸出所有排列方案,每個方案佔一行。

input

3output

1 2 3

1 3 2

2 1 3

2 3 1

3 1 2

3 2 1

這道題我們就可以使用dfs演算法來完成:

#include

#include

#include

using

namespace std;

const

int n=

1e5+3;

int n,m,j,k,l;

int s[n]

;bool st[n]

;void

dfs(

int k)

for(

int i=

1;i<=n;i++)}

}int

main()

簡介:bfs又叫廣度優先搜尋,主要使用佇列來完成某些操作

廣度優先搜尋使用佇列來實現,整個過程也可以看做乙個倒立的樹形:

1、把根節點放到佇列的末尾。

2、每次從佇列的頭部取出乙個元素,檢視這個元素所有的下一級元素,把它們放到佇列的末尾。並把這個元素記為它下一級元素的前驅。

3、找到所要找的元素時結束程式。

4、如果遍歷整個樹還沒有找到,結束程式。

注:模板不一定唯一

#include

//這裡我們使用stl

const

int n=

103;

int st[n]

[n]=

;typedef

struct node

list;

//定義結構體,用來存放點或者其他

//定義方向陣列

int dx[4]

=;int dy[4]

=;queueq;

//定義佇列

void

bfs(引數)}}

進行最後的相關操作;

}

走迷宮

給定乙個n*m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。

最初,有乙個人位於左上角(1, 1)處,已知該人每次可以向上、下、左、右任意乙個方向移動乙個位置。

請問,該人從左上角移動至右下角(n, m)處,至少需要移動多少次。

資料保證(1, 1)處和(n, m)處的數字為0,且一定至少存在一條通路。

input

第一行包含兩個整數n和m。

接下來n行,每行包含m個整數(0或1),表示完整的二維陣列迷宮。

output

輸出乙個整數,表示從左上角移動至右下角的最少移動次數。

input

5 50 1 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 1 1 0

0 0 0 1 0

output

8

#include

#include

#include

#include

using

namespace std;

const

int n=

103;

typedef pair<

int,

int> pii;

int n,m;

int a[n]

[n],b[n]

[n];

void

bfs())

;int dx=

,dy=

;while

(!q.

empty()

) q.

push()

; b[x]

[y]=b[t.first]

[t.second]+1

;}} cout<[m-1

]<}int

main()

bfs();

return0;

}

學習這兩演算法時候,確實耗費了不少時間與精力。每每回想過去一點點的進步,便有了繼續下去的動力。資料結構部分可以說是告一段落了,下次就是演算法部分。希望大家可以給出更好的意見。

BFS與DFS演算法

dfs總結 首先,我們先了解一下bfs,bfs又稱廣度優先搜尋,一般都是用於解決一些圖,樹的遍歷問題。其實廣度優先搜尋就類似與二叉樹的層序遍歷過程,需要借助c 中stl裡面的queue佇列容器來實現這個過程。它其實就是一種分層查詢的過程,每次向前走一步,都會去訪問一批可以訪問的節點,不會存在dfs裡...

演算法 DFS與BFS

一 dfs 深度優先搜尋 dfs 深度優先遍歷dfs與樹的先序遍歷比較類似。假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點然後依次訪問它的所有鄰接結點,每次訪問乙個鄰接結點時,以該鄰接結點為根結點繼續進行dfs,直到結點的所有鄰接結點以及其鄰接結點的鄰接結點都被訪問完,才訪...

資料結構基礎 21 DFS與BFS

從圖中某個頂點v0 出發,訪問此頂點,然後依次從v0的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v0有路徑相通的頂點都被訪問到 使用堆疊 使用鄰接矩陣儲存的無向圖的深度優先遍歷 template void graph dfs else 使其還可以再深 廣度優先搜尋 for int i...