【數據結構】圖的深度優先搜索

  圖的深度優先搜索類似于樹的深度優先搜索。不同的是,圖中可能包括循環,即我們有可能重復訪問節點。為了避免訪問已經訪問過的節點,我們要使用一個布爾變量的數組。

  例如,在下圖中,我們從節點2開始訪問。當訪問到節點0,我們尋找它的所有緊接節點。節點2也屬于節點0的鄰接節點。如果我們沒有標記訪問的節點,那么節點2 將會被重復訪問,這樣的話整個算法過程就不會停下來了。下圖的深度優先搜索是2,0,1,3

  這種搜索算法所遵循的搜索策略是盡可能“深”地搜索一個圖。它的基本思想如下:首先訪問圖中某一起始頂點v,然后由v出發,訪問與v鄰接且未被訪問的任一頂點w1,再訪問與w1鄰接且未被訪問的任一頂點w2,......重復上述過程。當不能再繼續向下訪問時,一次退回到最近被訪問的頂點,若它還有鄰接頂點未被訪問過,則從該點開始繼續上述搜索過程,直到圖中所有頂點均被訪問過為止。

  舉個例子:

  

  上圖一幅無向圖。我們從A點開始遍歷,并假設左邊的節點先被訪問到。那么訪問順序是A,搜索A所有可訪問的鄰接節點并選擇B,然后訪問B,搜索B所有可訪問的鄰接節點并選擇D,然后訪問D,搜索D的所有可訪問的鄰接節點。由于D只有一個鄰接節點B,而B已經被訪問過。所以回退到D的上級B(注意,不是訪問B,僅僅是回到上級)。然后再搜索B的所有可訪問的鄰接節點,AD已經被訪問過,所以訪問F。這個過程一直持續直到訪問過所有的節點。

  選擇可訪問鄰接節點的時候,可以使用我們自己定義的順序。比如訪問A的鄰接節點的時候,可以先訪問B,也可以先訪問E。可根據需求靈活調整。

?

下述代碼是深度優先搜索的C++版本,有遞歸和迭代版本。圖的實現使用鄰接鏈表表示。STL的list被用來存儲鄰接節點。

#include<list>
#include<iostream>
using namespace std;class Graph {private:int V;list<int>* adj;void DfsUtil(int v, bool visited[]);public:Graph(int n);    //No of vertices~Graph();    //Pointer to an array containing adjacency listsvoid addEdge(int v, int w);    //function to add an edge to graphvoid Dfs(int s);    //Dfs traversal of the vertices reachable from vvoid DfsIter(int s);
};Graph::Graph(int v) {V = v;adj = new list<int>[V];
}Graph::~Graph() {delete []adj;adj = NULL;
}void Graph::addEdge(int v, int w) {adj[v].push_back(w);    //Add w to v's list
}void Graph::Dfs(int s) {bool* visited = new bool[V];for (int i = 0; i < V; i++)visited[V] = false;DfsUtil(s, visited);
}void Graph::DfsUtil(int v, bool visited[]) {//Mark the current node as the visited and print itvisited[v] = true;cout<<v<<" ";//Recur for all vertices adjacent to this vertexlist<int>::iterator i;for (i = adj[v].begin(); i != adj[v].end(); i++)if (!visited[*i])DfsUtil(*i, visited);
}void Graph::DfsIter(int v) {bool*  visited = new bool[V];for (int i = 0; i < V; i++)visited[i] = false;list<int> stack;stack.push_back(v);list<int>::iterator i;while (!stack.empty()) {v = stack.back();cout<<v<<" ";stack.pop_back();visited[v] = true;for(i = adj[v].begin(); i != adj[v].end(); i++)if (!visited[*i])stack.push_back(*i);} delete []visited;
}int main()
{// Create a graph given in the above diagramGraph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);cout << "Following is Depth First Traversal (starting from vertex 2) \n";g.DfsIter(2);return 0;
}

?

輸出:

Following is Depth First Traversal (starting from vertex 2)
2 0 1 3

?

參考資料:

  1. http://www.geeksforgeeks.org/depth-first-traversal-for-a-graph/

轉載于:https://www.cnblogs.com/vincently/p/4769617.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258418.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flex中dispatchEvent的用法(自定義事件) .

Evevt和EventDispatcher類在as3的事件機制中是很重要的角色&#xff0c;dispatchEvent()是EventDispatcher類的一個事件發送方法&#xff0c;它可以發送出Event類或其子類的實例&#xff0c;在as3中所有的顯示對象都可以發送事件&#xff0c;因為as3中所有的顯示對象都是EventD…

菜鳥超級進口大倉618首度亮相!跨境商品也能當日次日達

6月12日下午3點40分&#xff0c;來自南京的一名用戶收到了由寧波保稅倉發出、圓通速遞配送的雀巢咖啡&#xff0c;這距離他在天貓國際上下單僅過去4小時。 天貓618在昨日迎來進口日&#xff0c;進口銷量火爆上升。作為國內最為先進的跨境進口倉&#xff0c;菜鳥超級大倉在本次大…

頻域/s域/z域三大變換的發展史及其聯系

本文主要介紹三大變換&#xff08;傅里葉變換、拉普拉斯變換及Z變換&#xff09;的發展史及其之間的聯系。

Tomcat8.0.21登錄時忘記用戶名和密碼

大概是這學期開學沒多久吧&#xff0c;4月份的時候&#xff0c;為了學習javaEE&#xff0c;裝了Tomcat。過了這么久早就忘記用戶名和密碼了&#xff0c;所以無法進入Tomcat的管理界面。百度&#xff08;其實我也很想用google&#xff09;了一堆&#xff0c;幾乎都是修改用戶配置…

二元隱函數求二階偏導_在線計算專題(03):具體、抽象函數的導數、微分與方向導數的計算...

導數與微分是微積分內容的基礎&#xff0c;就計算來說一元函數與多元函數的導數的計算思想一致. 不管是一元函數還是多元函數&#xff0c;導數、偏導數的計算都是將函數視為求導變量的一元函數求導數。微分在描述形式略有區別&#xff0c;但是其計算方法還是一樣&#xff0c;只…

android更換工具鏈

歡迎轉載opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e73 android編譯系統是跟隨android源碼一起發布的&#xff0c;使用了gcc編譯器&#xff0c;也就是所謂的交叉編譯環境。android-4.2里用的編譯器是gcc4.6&#xff0c;本篇升級gcc4.6到gcc4.6&#xff0c;修…

頻域/s域/z域三大變換的性質對比

本文主要介紹三大變換&#xff08;傅里葉變換、拉普拉斯變換及Z變換&#xff09;的性質對比及其常用信號變換。

Java系列(1) JavaEE架構

JavaEE是開發分布式應用的工業標準&#xff0c;Weblogic,BES,Tomcat等是比較常見的JavaEE服務器&#xff0c;嚴格來說Tomcat沒有實現全部的JavaEE規范&#xff0c;只能算是Servlet容器。我們從一幅Spec文檔上的架構圖,粗略了解JavaEE的基本結構。該結構圖表達了JavaEE各元素的邏…

協整檢驗r語言代碼_R語言時間序列分析實例

#加載數據xread.table(file.choose())#生成時間序列對象xtimeseries#畫時間序列圖plot.ts(xtimeseries)#增加線性擬合曲線abline(lm(xtimeseries~time(xtimeseries)))1、分解時間序列分解一個時間序列意味著把它拆分成構成元件&#xff0c;一般序列包含一個趨勢部分、一個不規則…

pat1043. Is It a Binary Search Tree (25)

1043. Is It a Binary Search Tree (25) 時間限制400 ms內存限制65536 kB代碼長度限制16000 B判題程序Standard作者CHEN, YueA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains o…

微軟待辦應用更新

微軟做了一些更改和優化來改進微軟待辦。 為了在所有設備上獲得最佳體驗&#xff0c;需確保移動和桌面微軟待辦2021 年 12 月 31日之前的版本為 2.49 或更高版本&#xff0c;否則微軟待辦不再支持跨設備同步&#xff0c;但仍然能脫機使用。 桌面版的微軟待辦應用下載地址為&…

出租WiFi到底靠不靠譜?

創業是一種心態&#xff0c;也是不斷的探索&#xff0c;他融入我們的生活&#xff0c;從日常中積累&#xff0c;從小微處啟航。 一、背景交代 最近在換工作&#xff0c;本周搬到新租的單身公寓&#xff0c;空間不大&#xff0c;倒是干凈整潔。委托租房中介幫忙開通寬帶&#xf…

AD20學習筆記1---元件庫的創建

前言&#xff1a; 本文學習視頻是B站點擊率第一的凡億教育《Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設計視頻教程》&#xff0c;視頻地址&#xff1a;Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設…

nodejs環境搭建與express安裝配置

一、NPM 1、下載nodeJS 下載地址&#xff1a;https://nodejs.org/en/download/ 因為我的系統是Linux 的&#xff0c;所以下載已經編譯好的Linux&#xff0c;nodejs tar包 3、下載完成過后放到/usr/local/下面 4、解壓&#xff1a;因為這個包不是gz的包所以解壓 正確&#xff1a…

在vue中實現picker樣式_基于Vue實現timepicker

主要用到的還是Vue的基本知識而已&#xff0c;不過要想到的細節很多。先放效果&#xff0c;點擊上框&#xff0c;顯示timepicker。而且可以根據點擊的是時還是分來改變圓盤的數字。這里我用了兩個組件&#xff0c;和&#xff0c;這里的時和分的數值我掛在了根實例中&#xff0c…

玩玩

金字塔一樣輸出字母&#xff0c;如 輸入 d a a b a a b c b a a b c d c b a 代碼實現 #include<stdio.h> int main(void) { char z; int j,t,k; scanf("%c",&z); t0; if(z>a&&z<z) { for(int i0;i<z-a;i) { for(kz-a-t;k…

總結界面框架_UI_Adapter

本人定期更新經典案例及解決方案如有疑問請聯系我QQ1822282728 -- 277627117 下面是常用到的ui Demo安卓三級篩選菜單listview&#xff08;非常經典&#xff09; http://download.csdn.net/detail/zillvip/9138975android地圖應用&#xff08;路徑規劃&#xff0c;地理編碼&…

AD20學習筆記2---原理圖繪制及編譯檢查

前言&#xff1a; 本文學習視頻是B站點擊率第一的凡億教育《Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設計視頻教程》&#xff0c;視頻地址&#xff1a;Altium Designer 20 19&#xff08;入門到精通全38集&#xff09;四層板智能車PCB設…

git如何設置master分支的權限_Git 從master 分支拉新分支開發

一、 切換到被copy的分支(master)&#xff0c;并且從遠端拉取最新版本$git checkout master$git pull二、從當前分支拉copy開發分支$git checkout -b devSwitched to a new branch dev三、 把新建的分支push到遠端$git push origin dev四、拉取遠端分支$git pullThere is no tr…

Yii框架 phpexcel 導出

一、說明 之前使用的是PHPExcelXML包實現的數據導出&#xff0c;由于導出的文件擴展名為“.xls” 在office2007上帶不開&#xff0c;報如下圖錯誤&#xff08;用 WPS都能打開&#xff09; 因此&#xff0c;此次采用了 PHPExcel包 不僅支持生成Excel&#xff08;.xls&#xff09…