DFS應用——遍歷有向圖+判斷有向圖是否有圈

【0】README

0.1) 本文總結于 數據結構與算法分析, 源代碼均為原創, 旨在 理解 “DFS應用——遍歷有向圖+判斷有向圖是否有圈” 的idea 并用源代碼加以實現 ;
0.2) 判斷有向圖是否有圈的rule—— 一個有向圖是無圈圖當且僅當它沒有背向邊,背向邊定義,參見: http://blog.csdn.net/pacosonswjtu/article/details/49967255 
0.3) 代碼最后還添加了打印dfs遍歷路徑所產生的集合, 對的,dfs 就應該這么玩,Bingo!


【1】有向圖相關

1.1)對有向圖進行DFS的idea:利用與無向圖相同的思路, 也可以通過深度優先搜索以線性時間遍歷有向圖。如果圖不是強連通的,那么從某個節點開始的DFS可能訪問不了所有的節點。在這種情況下, 我們在某個未作標記的節點處開始,反復執行DFS, 直到所有節點都被訪問到;
1.2)基于以上描述, 我們看個荔枝(這只是一種可能的case):
這里寫圖片描述

  • step1)從頂點B 任意開始深度優先搜索, 訪問頂點B, C, A, D, E;
    這里寫圖片描述
  • step2)從頂點 F 任意開始DFS, 訪問頂點 F;
    這里寫圖片描述
  • step3)從頂點 H 任意開始DFS, 訪問頂點 H, J, I;
    這里寫圖片描述
  • step4)從頂點 G 任意開始DFS, 訪問頂點 G;
    這里寫圖片描述

1.3)對于以上的DFS過程, 對應的搜索優先搜索樹如下圖所示:
這里寫圖片描述
對上圖的分析(Analysis):

  • A1)深度優先生成森林中虛線箭頭是一些(v, w)邊, 其中的w 在考察時已經做了標記;
  • A2)我們看到,存在三種類型的邊并不通向新頂點:
    • A2.1)背向邊:如(A,B) 和 (I,H);
    • A2.2)前向邊:如(C,D) 和 (C,E), 它們從樹的一個節點通向一個后裔;
    • A2.3)交叉邊:如(F,C)和(G,F), 它們把不直接相關的兩個樹節點連接起來;
  • A3)深度優先搜索森林一般通過吧一些子節點和一些新的樹從左到右添加到森林中形成。 在以這種方式構成的有向圖的深度優先搜索中,交叉邊總是從右到左進行的;

1.4)深度優先搜索(DFS)的一個用途是: 檢測一個有向圖是否是無圈圖;

  • 4.1) 法則如下: 一個有向圖是無圈圖當且僅當它沒有背向邊;(上面的圖有背向邊, 因此它不是無圈圖)
  • 4.2)拓撲排序也可以用來確定一個圖是否是無圈圖。進行拓撲排序的另一種方法是通過深度優先生成森林的后序遍歷給頂點指定拓撲編號N, N-1, ..., 1; 只要圖是無圈的,這種排序就是一致的;

【2】source code + printing results(此處的dfs是對原始dfs修改而成的,與原始的dfs不同,但idea一樣)

2.1)download source code:  https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter9/p248_dfs_directed_graph
2.2)source code at a glance:(for complete code , please click the given link above)

void dfs(Vertex vertex, int depth)
{int i;int visitFlag;AdjTable temp;Vertex adjVertex;   //printf("\n\t visited[%c] = 1 ", flag[vertex]);visited[vertex] = 1; // update visited status of vertexvertexIndex[vertex] = counter++; // number the vertex with countertemp = adj[vertex]; visitFlag = 0;  while(temp->next){            adjVertex = temp->next->vertex;     if(visited[adjVertex]) // judge whether the adjVertes was visited before        {if(vertexIndex[vertex] > vertexIndex[adjVertex] && parent[vertex] != adjVertex)     {parent[adjVertex] = vertex; // building back side, attention of condition of building back side above// just for printing effectfor(i = 0; i < depth; i++)  printf("      ");printf("  v[%c]->v[%c] (backside) \n", flag[vertex], flag[adjVertex]);}           }//if(!visited[adjVertex])else{if(vertex == start)visitFlag = 1;parent[adjVertex] = vertex;// just for printing effectfor(i = 0; i < depth; i++)  printf("      ");           printf("  v[%c]->v[%c] (building edge) \n", flag[vertex], flag[adjVertex]);dfs(adjVertex, depth+1);}if(vertex == start && visitFlag) //conducingt dfs for only one adjoining vertex in the given graphbreak;  temp = temp->next;  } 
} 

2.3)printing results(第二張圖是對第一張圖的補充,我最后添加了 dfsPathSet 方法打印出上述dfs遍歷路徑所產生的集合):
這里寫圖片描述
這里寫圖片描述

轉載于:https://www.cnblogs.com/pacoson/p/4990616.html

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

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

相關文章

AbleCloud智能行業解決方案助力體重秤企業向“中國智造”轉變

近年來&#xff0c;體重秤消費群體的年齡層次與需求逐漸向多元化發展&#xff0c;品牌眾多、競爭激烈的傳統體重秤行業迎來了前所未有的挑戰——智能體重秤成為行業發展的大趨勢&#xff0c;功能單一、同質化嚴重已經成為阻礙傳統體重秤企業成長的桎梏&#xff0c;打造出具備“…

javaScript事件(一)事件流

一、事件 事件是文檔或者瀏覽器窗口中發生的&#xff0c;特定的交互瞬間。 事件是用戶或瀏覽器自身執行的某種動作&#xff0c;如click,load和mouseover都是事件的名字。 事件是javaScript和DOM之間交互的橋梁。 你若觸發&#xff0c;我便執行——事件發生&#xff0c;調用它的…

php輸入對話框,如何使用JavaScript實現輸入對話框

我們有時在網頁上進行注冊用戶信息時會出現彈窗進行提示&#xff0c;你需要輸入內容進行確認&#xff0c;那么&#xff0c;這樣的輸入對話框是怎么實現的呢&#xff1f;本篇文章就來介紹關于使用JavaScript實現輸入對話框的方法。我們可以使用prompt顯示輸入對話框要在JavaScri…

軟件缺陷的種類劃分

按照軟件缺陷的產生原因&#xff0c;可以將其劃分為不同的缺陷類別&#xff1a; 1、功能不正常 簡單地說就是所應提供的功能&#xff0c;在使用上并不符合產品設計規格說明書中規定的要求&#xff0c;或是根本無法使用。這個錯誤常常會發生在測試過程的初期和中期&#xff0c;有…

python——no module named XX

加PYTHONPATH吧&#xff0c;新建一個系統環境變量&#xff0c;把你的目錄復制進去即可轉載于:https://www.cnblogs.com/MarsMercury/p/4992629.html

CodeVS 1081 線段樹練習 2

1081 線段樹練習 2 時間限制: 1 s空間限制: 128000 KB題目等級 : 大師 Master題目描述 Description給你N個數&#xff0c;有兩種操作 1&#xff1a;給區間[a,b]的所有數都增加X 2&#xff1a;詢問第i個數是什么&#xff1f; 輸入描述 Input Description第一行一個正整數n&#…

bzoj4144 [AMPPZ2014]Petrol 圖論 最短路 并查集

bzoj4144 [AMPPZ2014]Petrol 圖論 最短路 并查集 1、這道題我們主要就是要求出距離一個油站的最近的油站 首先我們dijkstra 求出任意一個點到 離他最近的油站的距離 2、然后會發現 如果一條邊的兩個端點 的最近油站不同的話 那么這條邊就會在這兩個油站的最短路上 3、然后對于…

python函數理解,python對函數的理解

函數函數可以提高編寫代碼效率、代碼的重用、讓程序更小、模塊化可以將一段獨立功能的代碼集成在一個塊中、封裝獨立功能# 函數定義(參數名為形式參數)def 函數名(參數名):函數體# 調用函數(享受封裝的成功)函數名(實際參數)例&#xff1a;print函數print(sep,end) sep(元素中分…

06:空格分隔輸出

描述 讀入一個字符&#xff0c;一個整數&#xff0c;一個單精度浮點數&#xff0c;一個雙精度浮點數&#xff0c;然后按順序輸出它們&#xff0c;并且要求在他們之間用一個空格分隔。輸出浮點數時保留6位小數。 輸入共有四行&#xff1a;第一行是一個字符&#xff1b;第二行是一…

iOS開發UI篇—九宮格坐標計算

iOS開發UI篇—九宮格坐標計算 一、要求 完成下面的布局 二、分析 尋找左邊的規律&#xff0c;每一個uiview的x坐標和y坐標。 三、實現思路 (1)明確每一塊用得是什么view (2)明確每個view之間的父子關系&#xff0c;每個視圖都只有一個父視圖&#xff0c;擁有很多的子視圖。 (3)…

工業4.0時代企業如何用CRM實現模式變革

當前&#xff0c;全球經濟正處于變革的巨大浪潮之中&#xff0c;對于制造業來說&#xff0c;德國提出工業4.0&#xff0c;美國提出工業互聯網&#xff0c;而我國&#xff0c;正在大力推進“中國制造2025”。制造業實現轉型升級勢在必行。我國政府提出&#xff0c;要大力支持傳統…

oracle 9.2.0.2,在RedHat enterprise server 3 安裝oracle9i 2.0.0.1 并升級到9.2.0.6

oracle9i 2.0.4上個月從oracle網站下載沒有安裝在els3上。參考了網上的一些文章&#xff0c;并根據文章的提示找了一些資料和補丁&#xff0c;完成了這次的安裝。[more]1.安裝RedHat EL3現在的安裝界面都做的很好了,一路NEXT就可以安裝了.如果有困難,請參考其他linux安裝文檔進…

spring -mvc 將對象封裝json返回時刪除掉對象中的屬性注解方式

spring -mvc 將對象封裝json返回時刪除掉對象中的屬性注解方式 在類名,接口頭上注解使用在 JsonIgnoreProperties(value{"comid"}) //希望動態過濾掉的屬性 例 JsonIgnoreProperties(value{"comid"}) public interface 接口名稱{ } JsonIgnorePro…

HawkHost老鷹主機更換主域名方法

http://www.yd631.com/change-hawkhost-primary-domain/圣誕節優惠期間&#xff0c;很多童鞋們購買了老鷹主機&#xff0c;可能由于大家初次使用海外主機或者是CP面板的空間。購買主機的時候主域名是隨便輸入的或者是輸入后想換一個。我們可以通過以下方法進行操作。之前我們QQ…

ERP CRM與SCM整合過程中的知識轉移

ERP(Enterprise Resource Planning&#xff0c;企業資源計劃)、CRM(Customer Relationship Management&#xff0c;客戶關系管理)、SCM、CRM(Customer Relationship Management&#xff0c;客戶關系管理)、SCM(supply chain management&#xff0c;供應鏈管理)作為現代企業管理…

ubuntu 64 12.04 oracle,ubuntu server 12.04 x86_64 下安裝oracle xe 11 x86_64

1.下載oracle xe我下載的是oracle-xe-11.2.0-1.0.x86_64.rpm.zip2. 安裝必要程序或文件$sudo apt-get install unzip chkconfig libaio1 alien3.解壓上面的oraclexxx.zip文件,然后進行轉換$sudo alien -d --scripts oracle-xe-11.2.0-1.0.x86_64.rpm上面轉換完成后會生成一個 o…

IEnumerable 遍歷用法

咋一看到IEnumerable這個接口&#xff0c;我們可能會覺得很神奇&#xff0c;在一般的編程時&#xff0c;基本上我們是想不到去用它的&#xff0c;可是&#xff0c;俗話說得好&#xff0c;存在便是道理&#xff0c;那么&#xff0c;它對我們來說&#xff0c;能夠帶來哪些奇妙的事…

DELPHI設置枚舉類型size

delphi枚舉類型長度默認為2個字節(單字)&#xff0c;而在C中枚舉為4個字節(雙字)&#xff0c;如果需要跨這兩個平臺編程&#xff0c;傳輸結構時會由于數據長度不一造成災難。 經過查找資料&#xff0c;原來delphi可以通過{$Z} {$Z-} {$Z1} {$Z4} 等宏設置枚舉類型的長度&#x…

Nginx 反向代理 websocket 協議

為什么80%的碼農都做不了架構師&#xff1f;>>> 主要配置內容 server {listen 80;server_name xxx.xxx.xxx;location / {try_files $uri $uri/ /index.html;root /workspace/www;index index.html index.htm;}location ^~/letchat/ {proxy_pass http:/…

oracle中區間大小,Oracle的邏輯結構(表空間、段、區間、塊)——總結

Oracle邏輯結構全景結構圖以下為個人整理的一些關于Oracle邏輯結構的相關數據字典&#xff1a;SELECT * FROMDBA_TABLESPACES--記錄各個表空間的詳細信息SELECT * FROMDBA_TABLESPACE_USAGE_METRICS--記錄各個表空間的使用狀況SELECT * FROMDBA_DATA_FILES --記錄各個數據文件的…