算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷_第1頁(yè)
算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷_第2頁(yè)
算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷_第3頁(yè)
算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷_第4頁(yè)
算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、算法設(shè)計(jì):深度優(yōu)先遍歷和廣度優(yōu)先遍歷實(shí)現(xiàn)深度優(yōu)先遍歷過程1、圖的遍歷和樹的遍歷類似,圖的遍歷也是從某個(gè)頂點(diǎn)出發(fā),沿著某條搜索路徑對(duì)圖中每個(gè)頂 點(diǎn)各做一次且僅做一次訪問。它是許多圖的算法的基礎(chǔ)。深度優(yōu)先遍歷和廣度優(yōu)先遍歷是最為重要的兩種遍歷圖的方法。它們對(duì)無向圖和有 向圖均適用。注意:以下假定遍歷過程中訪問頂點(diǎn)的操作是簡(jiǎn)單地輸出頂點(diǎn)。2、布爾向量visited0 . n-1的設(shè)置圖中任一頂點(diǎn)都可能和其它頂點(diǎn)相鄰接。在訪問了某頂點(diǎn)之后,又可能順著某條回 路又回到了該頂點(diǎn)。為了避免重復(fù)訪問同一個(gè)頂點(diǎn),必須記住每個(gè)已訪問的頂點(diǎn)。為 此,可設(shè)一布爾向量visited0 . n-1,其初值為假,一旦訪問了

2、頂點(diǎn)Vi之后,便將 visitedi置為真。深度優(yōu)先遍歷(Depth-First Traversal)1 .圖的深度優(yōu)先遍歷的遞歸定義假設(shè)給定圖G的初態(tài)是所有頂點(diǎn)均未曾訪問過。在G中任選一頂點(diǎn)v為初始出發(fā) 點(diǎn)(源點(diǎn)兒則深度優(yōu)先遍歷可定義如下:首先訪問出發(fā)點(diǎn)v,并將其標(biāo)記為已訪問過; 然后依次從v出發(fā)搜索v的每個(gè)鄰接點(diǎn)w。若w未曾訪問過,則以w為新的出發(fā)點(diǎn)繼 續(xù)進(jìn)行深度優(yōu)先遍歷,直至圖中所有和源點(diǎn)v有路徑相通的頂點(diǎn)(亦稱為從源點(diǎn)可達(dá)的 頂點(diǎn))均已被訪問為止。若此時(shí)圖中仍有未訪問的頂點(diǎn),則另選一個(gè)尚未訪問的頂點(diǎn)作 為新的源點(diǎn)重復(fù)上述過程,直至圖中所有頂點(diǎn)均已被訪問為止。圖的深度優(yōu)先遍歷類似于樹的前

3、序遍歷。采用的搜索方法的特點(diǎn)是盡可能先對(duì)縱深 方向進(jìn)行搜索。這種搜索方法稱為深度優(yōu)先搜索(Depth-First Search)。相應(yīng)地,用此 方法遍歷圖就很自然地稱之為圖的深度優(yōu)先遍歷。2、深度優(yōu)先搜索的過程設(shè)x是當(dāng)前被訪問頂點(diǎn),在對(duì)x做過訪問標(biāo)記后,選擇一條從x出發(fā)的未檢測(cè)過的 邊(x , y)。若發(fā)現(xiàn)頂點(diǎn)y已訪問過,則重新選擇另一條從x出發(fā)的未檢測(cè)過的邊,否則 沿邊(x,y)到達(dá)未曾訪問過的y,對(duì)y訪問并將其標(biāo)記為已訪問過;然后從y開始搜索, 直到搜索完從y出發(fā)的所有路徑,即訪問完所有從y出發(fā)可達(dá)的頂點(diǎn)之后,才回溯到 頂點(diǎn)x,并且再選擇一條從x出發(fā)的未檢測(cè)過的邊。上述過程直至從x出發(fā)的所

4、有邊都 已檢測(cè)過為止。此時(shí),若x不是源點(diǎn),則回溯到在x之前被訪問過的頂點(diǎn);否則圖中 所有和源點(diǎn)有路徑相通的頂點(diǎn)(即從源點(diǎn)可達(dá)的所有頂點(diǎn))都已被訪問過,若圖G是連 通圖,則遍歷過程結(jié)束,否則繼續(xù)選擇一個(gè)尚未被訪問的頂點(diǎn)作為新源點(diǎn),進(jìn)行新的 搜索過程。3、深度優(yōu)先遍歷的遞歸算法深度優(yōu)先遍歷算法typedef enumFALSE,TRUEBoolean ; /FALSE 為 0,TRUE 為 1Boolean visitedMaxVertexNum; 訪問標(biāo)志向量是全局量void DFSTraverse(ALGraph *G) /深度優(yōu)先遍歷以鄰接表表示的圖G,而以鄰接矩陣表示G時(shí),算法完全與此相同

5、int i ;for(i=0;in;i+)visitedi=FALSE ; 標(biāo)志向量初始化for(i=0;in ; i+)if(!visitedi) /vi 未訪問過DFS(G,i); 以vi為源點(diǎn)開始DFS搜索 /DFSTraverse鄰接表表示的深度優(yōu)先搜索算法void DFS(ALGraph *G,int i)以vi為出發(fā)點(diǎn)對(duì)鄰接表表示的圖G進(jìn)行深度優(yōu)先搜索EdgeNode *p ;printf(visit vertex :%c , G-adjlisti.vertex); 訪問頂點(diǎn) vivisitedi=TRUE ; /標(biāo)記 vi 已訪問p=G-adjlisti.firstedge ;

6、取 vi 邊表的頭指針while(p)/依次搜索vi的鄰接點(diǎn)vj,這里j=p-adjvexif (!visitedp-adjvex)/若 vi 尚未被訪問DFS(G , p-adjvex);/則以Vj為出發(fā)點(diǎn)向縱深搜索 p=p-next ; /找vi的下一鄰接點(diǎn)/DFS(3 )鄰接矩陣表示的深度優(yōu)先搜索算法void DFSM(MGraph *G , int i) 以vi為出發(fā)點(diǎn)對(duì)鄰接矩陣表示的圖G進(jìn)行DFS搜索,設(shè)鄰接矩陣是0,1矩陣int j;printf(visit vertex :%c , G-vexsi); 訪問頂點(diǎn) vivisitedi=TRUE ;for(j=0 ; jn ; j+

7、) /依次搜索vi的鄰接點(diǎn)if(G-edgesij=1&!visitedj)DFSM(G , j)/(vi , vj)eE ,且vj未訪問過,故vj為新出發(fā)點(diǎn)/DFSM注意:遍歷操作不會(huì)修改圖G的內(nèi)容,故上述算法中可將G定義為ALGraph或MGraph 類型的參數(shù),而不一定要定義為ALGraph和MGraph的指針類型。但基于效率上的考 慮,選擇指針類型的參數(shù)為宜。4、深度優(yōu)先遍歷序列對(duì)圖進(jìn)行深度優(yōu)先遍歷時(shí),按訪問頂點(diǎn)的先后次序得到的頂點(diǎn)序列稱為該圖的深度 優(yōu)先遍歷序列,或簡(jiǎn)稱為DFS序列。(1 ) 一個(gè)圖的DFS序列不一定惟一當(dāng)從某頂點(diǎn)x出發(fā)搜索時(shí),若x的鄰接點(diǎn)有多個(gè)尚未訪問過,則我們可任

8、選一個(gè)訪 問之。(2 )源點(diǎn)和存儲(chǔ)結(jié)構(gòu)的內(nèi)容均已確定的圖的DFS序列惟一鄰接矩陣表示的圖確定源點(diǎn)后,DFS序列惟一DFSM算法中,當(dāng)從vi出發(fā)搜索時(shí),是在鄰接矩陣的第i行上從左至右選擇下一個(gè) 未曾訪問過的鄰接點(diǎn)作為新的出發(fā)點(diǎn),若這樣的鄰接點(diǎn)多于一個(gè),則選中的總是序號(hào) 較小的那一個(gè)。只有給出了鄰接表的內(nèi)容及初始出發(fā)點(diǎn),才能惟一確定其DFS序列鄰接表作為給定圖的存儲(chǔ)結(jié)構(gòu)時(shí),其表示不惟一。因?yàn)猷徑颖砩线叡砝锏泥徑狱c(diǎn)域 的內(nèi)容與建表時(shí)的輸入次序相關(guān)。因此,只有給出了鄰接表的內(nèi)容及初始出發(fā)點(diǎn),才能惟一確定其DFS序列。3)棧在深度優(yōu)先遍歷算法中的作用深度優(yōu)先遍歷過程中,后訪問的頂點(diǎn)其鄰接點(diǎn)被先訪問,故在

9、遞歸調(diào)用過程中使用 棧(系統(tǒng)運(yùn)行時(shí)刻棧)來保存已訪問的頂點(diǎn)。5、算法分析對(duì)于具有n個(gè)頂點(diǎn)和e條邊的無向圖或有向圖,遍歷算法DFSTraverse對(duì)圖中每頂 點(diǎn)至多調(diào)用一次DFS或DFSM。從DFSTraverse中調(diào)用DFS(或DFSM)及DFS(或DFSM)內(nèi)部遞歸調(diào)用自己的總次數(shù)為n。當(dāng)訪問某頂點(diǎn)vi時(shí),DFS(或DFSM)的時(shí)間主要耗費(fèi)在從該頂點(diǎn)出發(fā)搜索它的所有鄰 接點(diǎn)上。用鄰接矩陣表示圖時(shí),其搜索時(shí)間為O(n);用鄰接表表示圖時(shí),需搜索第i 個(gè)邊表上的所有結(jié)點(diǎn)。因此,對(duì)所有n個(gè)頂點(diǎn)訪問,在鄰接矩陣上共需檢查n2個(gè)矩陣 元素,在鄰接表上需將邊表中所有0(e)個(gè)結(jié)點(diǎn)檢查一遍。所以,DFST

10、raverse的時(shí)間復(fù)雜度為0(n2)(調(diào)用DFSM)或0(n+e)(調(diào)用DFS)。1、廣度優(yōu)先遍歷的遞歸定義設(shè)圖G的初態(tài)是所有頂點(diǎn)均未訪問過。在G中任選一頂點(diǎn)v為源點(diǎn),則廣度優(yōu)先 遍歷可以定義為:首先訪問出發(fā)點(diǎn)v,接著依次訪問v的所有鄰接點(diǎn)w1,w2,wt, 然后再依次訪問與wl,w2,wt鄰接的所有未曾訪問過的頂點(diǎn)。依此類推,直至圖 中所有和源點(diǎn)v有路徑相通的頂點(diǎn)都已訪問到為止。此時(shí)從v開始的搜索過程結(jié)束。若G是連通圖,則遍歷完成;否則,在圖C中另選一個(gè)尚未訪問的頂點(diǎn)作為新源 點(diǎn)繼續(xù)上述的搜索過程,直至G中所有頂點(diǎn)均已被訪問為止。廣度優(yōu)先遍歷類似于樹的按層次遍歷。采用的搜索方法的特點(diǎn)是盡可

11、能先對(duì)橫向進(jìn) 行搜索,故稱其為廣度優(yōu)先搜索(Breadth-FirstSearch)。相應(yīng)的遍歷也就自然地稱為廣 度優(yōu)先遍歷。2、廣度優(yōu)先搜索過程在廣度優(yōu)先搜索過程中,設(shè)x和y是兩個(gè)相繼要被訪問的未訪問過的頂點(diǎn)。它們的 鄰接點(diǎn)分別記為x1,x2,xs和y1,y2,yt。為確保先訪問的頂點(diǎn)其鄰接點(diǎn)亦先被訪問,在搜索過程中使用FIFO隊(duì)列來保存已 訪問過的頂點(diǎn)。當(dāng)訪問x和y時(shí),這兩個(gè)頂點(diǎn)相繼入隊(duì)。此后,當(dāng)x和y相繼出隊(duì)時(shí), 我們分別從x和y出發(fā)搜索其鄰接點(diǎn)x1,x2,xs和y1,y2,yt,對(duì)其中未訪 者進(jìn)行訪問并將其人隊(duì)。這種方法是將每個(gè)已訪問的頂點(diǎn)人隊(duì),故保證了每個(gè)頂點(diǎn)至 多只有一次人隊(duì)。3、

12、廣度優(yōu)先搜索算法(1)鄰接表表示圖的廣度優(yōu)先搜索算法void BFS(ALGraph*G,int k)/以vk為源點(diǎn)對(duì)用鄰接表表示的圖G進(jìn)行廣度優(yōu)先搜索int i ;QrQueue Q - fqB炳乒 g=fflK-#DaETType 沼苛 mr-l- EdgeNode *p ;I2sueue(8lQ) M 乒3邕ffs回河=DIvkprmrf(-SH:vertex - %e=、Gvadj=sukJ .vertex); 乒。(Hr湖恭馴血 乒) wh=e (一 QueueEmpty(3Q)ff_LLLTn-!wgql liDeQueueGQ 二紊皿職申.任乒 PHG,vadj=seJ.MSEd

13、ge - Isvisis* wh=e(p):%-S#E沛=DIvj(4p,vadjvexnj) if(MSFredplvadexJ) vj*s回s prmrf(-B wfenQfPHP,vne$; zsvis-TI嘗沛=DI wfendwh=eMendwh=e)end of BFS(2)會(huì)嫡咨爵斗snsrjw注苗矚swm void BFSMzGraph *G mr-l-k)s vk Gmr-l-L 二QrQueue Q ;I2r-l-Queue(8lQ);prmrf(-SH:vertex - %c=、Gvvexsg) ; ffs回期汕 vk .sFredkllTRUE ;EnQueue(8lQ

14、、k);wh=e (一 QueueEmpty(aQ)HDeQueue(8lQ) ; fEE乒fooHO-AG,Vaj+M%-昏嘗汕 vj ifQvedgesmullHlslslMSFredtjsffvisf prmrfcvisFrvertex - %c=、Gvvexss) ; ffs回 VMeduHTRUE -EnQueueGQ、j)二fs回SSB wfendwh=e(3 )廣度優(yōu)先遍歷算法類似于 DFSTraverse。4、圖的廣度優(yōu)先遍歷序列廣度優(yōu)先遍歷圖所得的頂點(diǎn)序列,定義為圖的廣度優(yōu)先遍歷序列,簡(jiǎn)稱BFS序列。一個(gè)圖的BFS序列不是惟一的給定了源點(diǎn)及圖的存儲(chǔ)結(jié)構(gòu)時(shí),算法BFS和BFSM

15、所給出BFS序列就是惟一的。5、算法分析對(duì)于具有n個(gè)頂點(diǎn)和e條邊的無向圖或有向圖,每個(gè)頂點(diǎn)均入隊(duì)一次。廣度優(yōu)先遍 歷(BFSTraverse)圖的時(shí)間復(fù)雜度和DFSTraverse算法相同。當(dāng)圖是連通圖時(shí),BFSTraverse算法只需調(diào)用一次BFS或BFSM即可完成遍歷操作, 此時(shí)BFS和BFSM的時(shí)間復(fù)雜度分別為O(n+e)和0(n2)。來源: ( HYPERLINK .en/s/blog_625f01000100ffmz.html)-%e6%b7%b1%e5%ba%a6%e4%bc%98%e5%85%88%e6%90%9c%e7%b4%a2%e9%81%8d%e5%8e%86%e4%b8

16、%8e%e5%b9%bf%e5%ba%a6 .en/s/blog_625f01000100ffmz.html)-深度優(yōu)先搜索遍歷與廣度 優(yōu)先搜索遍歷Christina新浪博客深度優(yōu)先遍歷算法實(shí)現(xiàn):返回頂點(diǎn)v在頂點(diǎn)向量中的位置int LocateVex(ALGraph G, char v)int i;for(i = 0; v != G.verticesi.data & i = G.vexnum)return -1;return i;構(gòu)造鄰接鏈表Status CreateDN(ALGraph &G)int i,j;ArcNode *s;printf(輸入有向圖頂點(diǎn)數(shù):);scanf(%d, &G.

17、vexnum);printf(輸入有向圖邊數(shù):);o出 z、I 成峻笑(Qo)x 38。_1二 E i?o)xg$8o_lH 一 Eo罷Bg 苻義=ug=)JU8s 苜+工、-?WVSMU一do罷Bg 苜義=ug=)JU8s 苜+工、-?WVSMU一d) (+!注 nuuMov xo乂 AUDOJCN 頊elp o罷BgIJ-JnN n uBsFms8t o 回亞、叵地同芙(三SEEo義=ug=)JU8s 苜土c*e-pgwvs=wu_d(+UJnuxovo H DOJ o罷Bg (lunuuMo義=pg=)JU8s0 umCD(=ur)M_d個(gè) d=p 寸漫=wu一d(uBxCDuAd H

18、d(du-lBSM.msCDutCDND H d)0J(BPPIUSBQ o._=U9P 寸漫=wu一d(+UJnuxovo H D0J(血wHgs冬、=亞、叵=、-血驟-、-Sszlgs9gs 寸羅 _)M一d(d*dponu(旨 qdeo_Jpe4s f(0NU)J$z_s) uo-raE (*ONU”, G.verticesv.data);s = G.verticesv.firstarc;while(s != NULL)w = s-adjvex;if(visitedw = 0)DFS(G, w, visited);s = s-nextarc;對(duì)圖G做深度優(yōu)先遍歷Status DFSTra

19、verse(ALGraph G)int v;int visitedMAX_VERTEX_NUM;for(v = 0; v G.vexnum; +v)visitedv = 0; 初始化 visitedvfor(v = 0; v G.vexnum; +v)if(visitedv = 0)DFS(G, v, visited); /對(duì)未訪問的頂點(diǎn)調(diào)用DFS()printf(-完成n);return OK;廣度優(yōu)先遍歷算法實(shí)現(xiàn)。返回頂點(diǎn)v在頂點(diǎn)向量中的位置int LocateVex(ALGraph G, char v)int i;for(i = 0; v != G.verticesi.data & i

20、= G.vexnum)return -1;return i;構(gòu)造無向圖鄰接鏈表Status CreateUDN(ALGraph &G)int i, j;ArcNode *s, *t;printf(輸入有向圖頂點(diǎn)數(shù):);scanf(%d, &G.vexnum);printf(輸入有向圖邊數(shù):);scanf(%d”, &G.arcnum);getchar();for(int i = 0; i G.vexnum; i+)printf(輸入第d個(gè)頂點(diǎn)信息:,i+1);scanf(%c”, &G.verticesi); 構(gòu)造頂點(diǎn)向量G.verticesi.firstarc = NULL;getchar(

21、);char v1, v2;for(int k = 0; k adjvex = j; 該邊所指向的頂點(diǎn)的位置為js-nextarc = G.verticesi.firstarc;G.verticesi.firstarc =s;t-adjvex = i; 該邊所指向的頂點(diǎn)的位置為jt-nextarc = G.verticesj.firstarc;G.verticesj.firstarc =t;return OK;Status InitQueue(SqQueue &Q)Q.base = (QElemType *) malloc (MAXQSIZE * sizeof(QElemType); if(!

22、Q.base)printfC分配地址失敗!);return 0;Q.front = Q.rear = 0;return OK;已訪問圖頂點(diǎn)入隊(duì)Status EnQueue(SqQueue &Q, QElemType e)if(Q.rear+1) % MAXQSIZE = Q.front) 隊(duì)列已滿printf(隊(duì)列已滿!);return 0;Q.baseQ.rear = e;Q.rear = (Q.rear+1) % MAXQSIZE;return OK;判斷隊(duì)列是否為空Status QueueEmpty(SqQueue Q)if(Q.front = Q.rear)return OK;else

23、return 0;輔助隊(duì)列隊(duì)頭頂點(diǎn)出隊(duì)char DeQueue(SqQueue &Q)QElemType e;if(Q.front = Q.rear) 隊(duì)列為空printf(隊(duì)列為空!);return 0;e = Q.baseQ.front;Q.front = (Q.front+1) % MAXQSIZE;return e;Status PrintAdjList(ALGraph &G)int i;ArcNode *p;printf(%4s%6s%12sn,編號(hào),頂點(diǎn),相鄰邊編號(hào));for(int i = 0; i nextarc) printf(%4d”, p-adjvex);printf(n);retu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論