【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
生活随笔
收集整理的這篇文章主要介紹了
【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
應用一
設計算法以求解無向圖G的連通分量的個數
圖示:
深度遍歷基本算法dfs(v0)如下 :
void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=firstadj(G,v0);while(w!=0) {if(!visited[w]) dfs(w);w=nextadj(G,v0,w);}} firstadj(G,v) :返回v的第一個鄰接點(號),或0(不存在時)。nextadj(G,v,w);返回v的第w鄰接點中處于鄰接點w之后的鄰接點號, 或0(不存在時)對整個圖的遍歷算法如下:
void travel_dfs(graph G) {for (i=1; i<=n; i++) visited[i]=FALSE;for (i=1; i<=n; i++)if(!visited[i]) dfs(i);}對無向圖G來說,選擇某一頂點v執行dfs(v),可訪問到所在連通分量中的所有頂點因此,選擇起點的次數就是圖G的連通分量數, 這可通過修改遍歷整個圖的算法dfs_travel來實現:每調用一次dfs算法計數一次。另外,考慮到要求求解連通分量數,因而可以將算法設計為整型函數。
具體算法如下
2 設計算法求出無向圖G的邊數
void dfs (graph G, int v ) { int w;visited[v]=TRUE; //設置訪問標志(訪問結點的其它操作被省去)w=firstadj(G,v);while (w!=0){ E++; //此處意味著找到一條邊,故累計到變量E中if (visited[w]==FALSE)dfs(G,w);w=nextadj(G,v,w);} }int Enum (graph G ) { int i; E=0; //全局變量E記錄整個圖中的邊數for (i=1; i<=n; i++) visited[i]=FALSE; for (i=1; i<=n; i++)if (visited[i]==FALSE;) dfs(G,i);return E/2;//注意,因為是無向圖,每一條邊統計了兩次,返回E/2 }與上面最初的dfs相比多了一個用于統計的E
深度遍歷算法的應用二
設計算法,將1–n(=20,或其他數)放在一個環上,使環上任意兩個相鄰元素的和為質數。
分析:可以用圖來描述該問題:
① 用頂點表示一個數
② 若兩個數的和為質數,
則對應頂點之間有一條邊。 例如,若n=10,對應圖如右所示。
在這一表示下,問題轉化為:求圖中包含所有頂點的簡單回路。
如圖所示的一個解。
(1,2,3,4,7,6,5,8,9,10)
算法設計中需要注意的: 通過在dfs算法的基礎上變化而得:
(1)路徑的記錄:需要增加變量或參數以記錄路徑,因此,不妨設一個數組以記錄路徑中的頂點序列和一個記錄長度的變量。
(2)若某些走法行不通,需要重來,為此,要恢復visited[i]標志。
(3)需要判斷首尾相接
總結
以上是生活随笔為你收集整理的【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔记】springboot+sprin
- 下一篇: 【算法】广度遍历算法的应用 求出距离顶点