日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深度优先搜索重要模板

發(fā)布時(shí)間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度优先搜索重要模板 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

深度優(yōu)先搜索(Depth-First-Search)

從起點(diǎn)出發(fā),走過的點(diǎn)要做標(biāo)記,發(fā)現(xiàn)有沒走過的點(diǎn),就隨意挑一個往前走,走不 了就回退,此種路徑搜索策略就稱為“深度優(yōu)先搜索”,簡稱“深搜”。

其實(shí)稱為“遠(yuǎn)度優(yōu)先搜索”更容易理解些。因?yàn)檫@種策略能往前走一步就往前走一 步,總是試圖走得更遠(yuǎn)。所謂遠(yuǎn)近(或深度),就是以距離起點(diǎn)的步數(shù)來衡量的。

中國大學(xué)mooc 郭煒老師的算法上講的幾個模板(偽代碼)
我寫了一下注釋,便于理解

1.判斷從V出發(fā)是否能走到終點(diǎn)

int main() {將所有點(diǎn)標(biāo)記為新點(diǎn)起點(diǎn) = 1;終點(diǎn) = 8;cout<<Dfs(起點(diǎn)); }bool Dfs(V){if(V為終點(diǎn))return true;if(V為舊點(diǎn))return false;將V標(biāo)記為舊點(diǎn)對和V相鄰的每個節(jié)點(diǎn)U{//往往要寫多個if,將每個相鄰節(jié)點(diǎn)都考慮到if(Dfs(U)==true)return true; }return fasle; }

2.判斷從V出發(fā)是否能走到終點(diǎn),如果能,要記錄路徑:

Node path[MAX_LEN];//MAX_LEN取節(jié)點(diǎn)總數(shù)即可 //path,記錄路徑。node,可以是int(節(jié)點(diǎn)標(biāo)號),也可以是結(jié)構(gòu)題類型 int depth;//深度int main() {將所有點(diǎn)標(biāo)記為新點(diǎn);//一般memset全變成0表示新點(diǎn),1表示舊點(diǎn)depth = 0;if(Dfs(起點(diǎn))){for(int i=0;i<=depth;++i)//輸出經(jīng)過的每個點(diǎn)的路徑cout<<path[i]<<endl;} }bool Dfs(V){if(V為終點(diǎn))path[depth]=V;return true; }if(V為舊點(diǎn))return false;將V標(biāo)記為舊點(diǎn);path[depth]=V;++depth;對和V相鄰的每個節(jié)點(diǎn)U{if(Dfs(U)==true) //如果返回true,那么說明,從v開始能走到終點(diǎn) }--depth;//現(xiàn)在v是放到path里的,但是返回false,說明從v出發(fā)走不到終點(diǎn),//v不應(yīng)出現(xiàn)在路徑里,所以深度減一。return false; }

3.深度優(yōu)先遍歷圖上所有節(jié)點(diǎn)

Dfs (V) { if( V是舊點(diǎn) )return; //如果v已經(jīng)走過,那馬上返回將V標(biāo)記為舊點(diǎn) ;對和 V相鄰的每個點(diǎn) U { Dfs (U);//包含他的父節(jié)點(diǎn)和子節(jié)點(diǎn)都要涉及到//常用if判斷條件是否滿足,然后dfs} } int main() {將所有點(diǎn) 都標(biāo)記為新;while( 在圖中能找到新點(diǎn) k)Dfs (k);//這樣避免了有多個連通圖的情況 }

總結(jié)

以上是生活随笔為你收集整理的深度优先搜索重要模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。