引言:經過上一次的學習,我們明白了圖的基本操作。這一次,我們學習圖的兩種基本演算法——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...