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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数

發布時間:2024/9/30 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】深度优先搜索遍历的应用 设计算法以求解无向图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算法計數一次。另外,考慮到要求求解連通分量數,因而可以將算法設計為整型函數。
具體算法如下

int numofGC(graph G) { int i; int k=0; // k用于連通分量的計數for (i=1; i<=n; i++)visited[i]=FALSE; for (i=1; i<=n; i++)if (visited[i]==FALSE){ k++; dfs(G,i); } //用k來累計連通分量個數return k ; }

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)需要判斷首尾相接

void getcc(int k)// A,B,visited為全局變量,k初值為1,B[1]固定為1 { int i;if (k==n && A[B[n],B[1]]==1) // 所有頂點在路徑上,且構成回路,輸出print(B); else if (k<n && k>0) for (i=1;i<=n; i++)if (visited[i]==FALSE && A[B[k],i]==1) // 搜索與B[k]相鄰的下一個數i{ visited[i]=TRUE; B[k+1]=i; // 將i放入路徑中getcc(k+1); // 往后搜索visited[i]=FALSE; // 取消頂點i的放置,以便可被重新放入 }}

總結

以上是生活随笔為你收集整理的【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。