【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
應用一
設計算法以求解無向圖G的連通分量的個數(shù)
圖示:
深度遍歷基本算法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執(zhí)行dfs(v),可訪問到所在連通分量中的所有頂點因此,選擇起點的次數(shù)就是圖G的連通分量數(shù), 這可通過修改遍歷整個圖的算法dfs_travel來實現(xiàn):每調用一次dfs算法計數(shù)一次。另外,考慮到要求求解連通分量數(shù),因而可以將算法設計為整型函數(shù)。
具體算法如下
2 設計算法求出無向圖G的邊數(shù)
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記錄整個圖中的邊數(shù)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;//注意,因為是無向圖,每一條邊統(tǒng)計了兩次,返回E/2 }與上面最初的dfs相比多了一個用于統(tǒng)計的E
深度遍歷算法的應用二
設計算法,將1–n(=20,或其他數(shù))放在一個環(huán)上,使環(huán)上任意兩個相鄰元素的和為質數(shù)。
分析:可以用圖來描述該問題:
① 用頂點表示一個數(shù)
② 若兩個數(shù)的和為質數(shù),
則對應頂點之間有一條邊。 例如,若n=10,對應圖如右所示。
在這一表示下,問題轉化為:求圖中包含所有頂點的簡單回路。
如圖所示的一個解。
(1,2,3,4,7,6,5,8,9,10)
算法設計中需要注意的: 通過在dfs算法的基礎上變化而得:
(1)路徑的記錄:需要增加變量或參數(shù)以記錄路徑,因此,不妨設一個數(shù)組以記錄路徑中的頂點序列和一個記錄長度的變量。
(2)若某些走法行不通,需要重來,為此,要恢復visited[i]標志。
(3)需要判斷首尾相接
總結
以上是生活随笔為你收集整理的【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【笔记】springboot+sprin
- 下一篇: 【算法】广度遍历算法的应用 求出距离顶点