C 用DFS 深度優先搜尋 求連通塊個數

2021-07-31 16:22:26 字數 903 閱讀 3430

圖描述的是一些個體之間的關係。與線性表和二叉樹不同的是:這些個體之間既不是前驅後繼的順序關係,也不是祖先後代的層次關係,而是錯綜複雜的網狀關係。

和二叉樹的遍歷類似,圖也有dfs和bfs遍歷,由於dfs更容易編寫,一般用dfs找連通塊。下面用乙個例子說明。

例題:輸入乙個m行n列的字元矩陣,統計字元「@」組成多少個八連塊。如果兩個字元「@」所在的格仔相鄰(橫、縱或者對角線方向),就說它們屬於乙個八連塊。例如,下圖中有兩個八連塊

用dfs實現的基本思路是:從每個「@」格仔出發,遞迴遍歷它周圍的「@」格仔。每次訪問乙個格仔時就給它寫上乙個「連通分量編號」(即下面**的idx陣列),這樣就可以在訪問之前檢查它是否已經有了編號,從而避免同乙個格仔訪問多次。

**實現如下:

#include#includeconst int maxn=100+5;

//存圖的陣列

char pic[maxn][maxn];

//m 圖有幾行 n圖有幾列 idx[i][j]連通分量編號

int m,n,idx[maxn][maxn];

//r 圖的縱座標 c圖的橫座標 id連通分量編號

void dfs(int r,int c,int id)

int main()

{ //要想停止輸入則將m或者n賦值為0

while(scanf("%d%d",&m,&n)==2&&m&&n)

{for(int i=0;i**的執行結果如下:

深度優先搜尋求最大流

luogu p2740 usaco4.2 草地排水drainage ditches 題目背景 題目描述 農夫約翰知道每一條排水溝每分鐘可以流過的水量,和排水系統的準確布局 起點為水潭而終點為小溪的一張網 需要注意的是,有些時候從一處到另一處不只有一條排水溝。根據這些資訊,計算從水潭排水到小溪的最大流...

DFS(深度優先搜尋) (C )

1 演算法用途 用於遍歷圖中的節點,有些類似於樹的深度優先遍歷。這裡唯一的問題是,與樹不同,圖形可能包含迴圈,因此我們可能會再次來到同一節點。2 基本思想 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷 直至圖中和v有路徑相通的頂...

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...