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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

6.1 图的深度优先和广度优先搜索

發(fā)布時(shí)間:2024/1/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.1 图的深度优先和广度优先搜索 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

圖的廣度優(yōu)先搜索

圖的的搜索算法主要分為廣度優(yōu)先搜索(breadth-first?search或BFS)深度優(yōu)先搜索(depth-first?search或DFS)。首先討論廣度優(yōu)先搜索算法。

稱之為廣度優(yōu)先,是因?yàn)樗惴ㄊ冀K首先發(fā)現(xiàn)距離起始頂點(diǎn)較近的頂點(diǎn),然后才發(fā)現(xiàn)較遠(yuǎn)的頂點(diǎn)。假設(shè)搜索的出發(fā)頂點(diǎn)為s,則首先搜索與s直接相鄰的頂點(diǎn),然后再搜索這些相鄰頂點(diǎn)的相鄰頂點(diǎn)。在搜索過(guò)程中可以記錄每個(gè)頂點(diǎn)到起始頂點(diǎn)s的距離。這種搜索算法能生成一棵以s為根、包括所有s可達(dá)的頂點(diǎn)的廣度優(yōu)先搜索樹(BFS樹)。圖中各頂點(diǎn)的訪問(wèn)次序?qū)?yīng)于廣度優(yōu)先搜索樹中各節(jié)點(diǎn)由頂至底的層次。

在這里我們?cè)O(shè)計(jì)算法跟蹤圖中各個(gè)頂點(diǎn)的訪問(wèn)次序,記錄各個(gè)頂點(diǎn)在BFS樹中的層數(shù)(搜索深度)以及父頂點(diǎn)。首先將各個(gè)頂點(diǎn)著白色,在跟蹤各個(gè)頂點(diǎn)訪問(wèn)次序時(shí),第一次被訪問(wèn)的頂點(diǎn)的顏色改變?yōu)榛疑?#xff0c;直至與之相鄰的所有頂點(diǎn)都被訪問(wèn)時(shí)顏色改變?yōu)楹谏T谶@個(gè)過(guò)程中顏色為黑色和白色的頂點(diǎn)之間被顏色為灰色的頂點(diǎn)分割開來(lái)。廣度優(yōu)先搜索算法的實(shí)現(xiàn)借助于隊(duì)列結(jié)構(gòu),代碼如下:

?

/**
?????*?廣度優(yōu)先搜索算法,從第start節(jié)點(diǎn)開始進(jìn)行搜索;
?????*?算法中利用到隊(duì)列數(shù)據(jù)結(jié)構(gòu)。
?????*?
@param?G????????待搜索的圖
?????*?
@param?start????搜索的起點(diǎn)
?????
*/
????static?void?BFS(GraphLnk?G,?int?start){
????????int?n?=?G.get_nv();
????????if(start?<?0?||?start?>=?n)?return;
????????color?=?new?COLOR[n];
????????//?節(jié)點(diǎn)的父節(jié)點(diǎn),非負(fù)整數(shù)
????????parent?=?new?int[n];
????????//?深度depth
????????d?=?new?int[n];????
????????//?初始化
????????for(int?i?=?0;?i?<?n;?i++){
????????????//將所有頂點(diǎn)的顏色著色為白色
????????????color[i]?=?COLOR.WHITE;
????????????//所有頂點(diǎn)的父母初始化為-1
????????????parent[i]?=?-1;
????????????//所有頂點(diǎn)的深度初始化為無(wú)窮大
????????????d[i]?=?Integer.MAX_VALUE;
????????}
????????//?起點(diǎn)著色為灰色
????????color[start]?=?COLOR.GRAY;
????????//?起點(diǎn)無(wú)父節(jié)點(diǎn),記為-1
????????parent[start]?=?-1;
????????//?起點(diǎn)的深度為0
????????d[start]?=?0;
????????// 創(chuàng)建隊(duì)列
????????LinkQueue?Q?=?new?LinkQueue();
????????//將起點(diǎn)添加到隊(duì)列中
????????Q.enqueue(new?ElemItem<Integer>(start));
????????//?迭代第對(duì)隊(duì)列首頂點(diǎn)的相鄰邊重新著色
????????while(Q.currSize()?>?0){
????????????//?隊(duì)列首頂點(diǎn)u
????????????int?u?=?((Integer)(Q.dequeue().elem)).intValue();
????????????for(Edge?w?=?G.firstEdge(u);?
????????????????G.isEdge(w);?
????????????????w?=?G.nextEdge(w)){
????????????????/*?如果u的相鄰頂點(diǎn)第一次被發(fā)現(xiàn)了,則將其顏色改變?yōu)榛疑?#xff0c;
?????????????????*?其深度增加1,其父頂點(diǎn)為u,并將該頂點(diǎn)添加到隊(duì)列?
*/
????????????????if(color[w.get_v2()]?==?COLOR.WHITE){
????????????????????color[w.get_v2()]?=?COLOR.GRAY;
????????????????????d[w.get_v2()]?=?d[u]?+?1;
????????????????????parent[w.get_v2()]?=?u;
????????????????????Q.enqueue(new?ElemItem<Integer>(w.get_v2()));
????????????????}
????????????}
????????????//?搜索了頂點(diǎn)u的所有相鄰頂點(diǎn)后,將其顏色改變?yōu)楹谏?/span>
????????????color[u]?=?COLOR.BLACK;????
????????????//?打印此時(shí)各個(gè)頂點(diǎn)的顏色
????????????for(int?i?=?0;?i?<?n;?i++){
????????????????System.out.print(i?+?")"?+?color[i]?+?"\t");
????????????}
????????????System.out.println();
????????}
????????//?打印所有頂點(diǎn)的搜索深度
????????System.out.println("各頂點(diǎn)的深度為:");
????????for(int?i?=?0;?i?<?n;?i++){
????????????System.out.print(d[i]?+?"\t");
????????}
????????//?打印所有頂點(diǎn)的父頂點(diǎn)
????????System.out.println("\n各頂點(diǎn)的父母為:");
????????for(int?i?=?0;?i?<?n;?i++){
????????????System.out.print(parent[i]?+?"\t");
????????}
????????System.out.println();
????}

?

?

???? 從函數(shù)的實(shí)現(xiàn)可以發(fā)現(xiàn),廣度優(yōu)先搜索算法是迭代實(shí)現(xiàn)的。迭代過(guò)程借助隊(duì)列結(jié)構(gòu)暫存著灰色的頂點(diǎn)。首先訪問(wèn)頂點(diǎn)s,并將與其相鄰的、未訪問(wèn)過(guò)的頂點(diǎn)都添加到隊(duì)列中;然后迭代地將隊(duì)列中頂點(diǎn)彈出、對(duì)其訪問(wèn),并將與其相鄰的、未訪問(wèn)過(guò)的頂點(diǎn)添加到隊(duì)列中。在前面章節(jié)我們討論過(guò),隊(duì)列中元素項(xiàng)遵循先入先出(FIFO)的規(guī)則;迭代直至隊(duì)列為空為止。在BFS算法中FIFO規(guī)則保證了圖中頂點(diǎn)的訪問(wèn)次序:先訪問(wèn)的頂點(diǎn)距離起始頂點(diǎn)更近。

???? 依然以圖(a)為例來(lái)分析廣度優(yōu)先算法的過(guò)程以及廣度優(yōu)先樹的意義,搜索的起點(diǎn)為頂點(diǎn)1。測(cè)試示例代碼為:

?

?

//?構(gòu)造連接表實(shí)現(xiàn)的圖
????????GraphLnk?GL?=?
????????????Utilities.BulidGraphLnkFromFile("Graph\\graph1.txt");
????????GraphSearch.BFS(GL,?1);

?

運(yùn)行結(jié)果為:

0)GRAY1)BLACK2)WHITE3)WHITE4)WHITE5)GRAY6)WHITE7)WHITE

0)BLACK1)BLACK2)WHITE3)WHITE4)GRAY5)GRAY6)WHITE7)WHITE

0)BLACK1)BLACK2)GRAY3)WHITE4)GRAY5)BLACK6)GRAY7)WHITE

0)BLACK1)BLACK2)GRAY3)WHITE4)BLACK5)BLACK6)GRAY7)WHITE

0)BLACK1)BLACK2)BLACK3)GRAY4)BLACK5)BLACK6)GRAY7)WHITE

0)BLACK1)BLACK2)BLACK3)GRAY4)BLACK5)BLACK6)BLACK7)GRAY

0)BLACK1)BLACK2)BLACK3)BLACK4)BLACK5)BLACK6)BLACK7)GRAY

0)BLACK1)BLACK2)BLACK3)BLACK4)BLACK5)BLACK6)BLACK7)BLACK

各頂點(diǎn)的深度為:

10232123

各頂點(diǎn)的父母為:

1-1520156

?

搜索過(guò)程中各頂點(diǎn)顏色及隊(duì)列中灰色頂點(diǎn)的變化過(guò)程如圖(1~8),每張圖對(duì)應(yīng)隊(duì)列中元素變化時(shí)的狀態(tài)。

?

?

?

圖?廣度優(yōu)先搜索過(guò)程

根據(jù)廣度優(yōu)先搜索算法得出的個(gè)頂點(diǎn)到起始點(diǎn)的距離可以得出廣度優(yōu)先搜索樹如下:

?

?

?

圖?BFS樹

廣度優(yōu)先搜索算法可以得到從給定起始頂點(diǎn)到每個(gè)可達(dá)頂點(diǎn)的距離,并且這個(gè)距離是頂點(diǎn)到起始頂點(diǎn)的最短路徑,具體的證明過(guò)程請(qǐng)參閱相關(guān)圖論數(shù)據(jù)。

. 圖的深度優(yōu)先搜索

???? 圖的另一種搜索算法稱為深度優(yōu)先搜索(DFS),正如算法的名稱那樣,DFS算法總是盡可能“深”地搜索圖。在DFS過(guò)程中,某個(gè)頂點(diǎn)v在被訪問(wèn)后,將遞歸地訪問(wèn)第一個(gè)尚未被訪問(wèn)過(guò)的相鄰點(diǎn),直至沒(méi)有相鄰點(diǎn)可訪問(wèn)為止;然后再回溯到頂點(diǎn)v,繼續(xù)遞歸訪問(wèn)v的第二個(gè)尚未訪問(wèn)過(guò)的相鄰點(diǎn)。這一過(guò)程一直進(jìn)行到已訪問(wèn)了起點(diǎn)可達(dá)的所有頂點(diǎn)為止。

???? 除了遞歸方式之外,還可以借助堆棧采用迭代方式實(shí)現(xiàn)。首先訪問(wèn)起點(diǎn)v,然后把頂點(diǎn)v及其相連的邊壓入棧中;彈出并訪問(wèn)棧頂元素,棧頂元素對(duì)應(yīng)的邊的另一頂點(diǎn)就是下一個(gè)訪問(wèn)的頂點(diǎn),對(duì)其重復(fù)頂點(diǎn)v的操作;迭代過(guò)程直至棧中沒(méi)有元素為止。

無(wú)論采用遞歸方式還是采用迭代方式,其結(jié)果都是首先沿著圖的一條路徑搜索直至它的末端,然后回溯,并沿著另一路徑搜索。這里我們主要實(shí)現(xiàn)DFS算法的遞歸方式。

在圖的廣度優(yōu)先搜索算法中我們記錄了圖中每個(gè)頂點(diǎn)的深度,并在搜索過(guò)程中對(duì)各頂點(diǎn)進(jìn)行著色的變化。在深度優(yōu)先搜索算法中,我們將同時(shí)記錄訪問(wèn)頂點(diǎn)的兩個(gè)時(shí)間(次序),第一個(gè)是開始訪問(wèn)頂點(diǎn)的時(shí)間d,另一個(gè)是訪問(wèn)完該頂點(diǎn)的所有相鄰頂點(diǎn)的時(shí)間f。根據(jù)這兩個(gè)時(shí)間的定義,對(duì)于頂點(diǎn)v,在時(shí)間dv之前頂點(diǎn)v一直為白色,在時(shí)間dv到fv之間頂點(diǎn)v為灰色,fv之后頂點(diǎn)為黑色。

???? 深度優(yōu)先搜索算法實(shí)現(xiàn)如下:

/**
?????*?深度優(yōu)先搜索算法,從第start個(gè)節(jié)點(diǎn)開始搜索
?????*?
@param?G????????待搜索的圖
?????*?
@param?start????搜索起點(diǎn)
?????
*/
????static?void?DFS(GraphLnk?G,?int?start){
????????int?n?=?G.get_nv();
????????//?時(shí)間戳更新計(jì)數(shù)器置0
????????time?=?0;
????????if(start?<?0?||?start?>=?n)?
????????????return;
????????//?各頂點(diǎn)的著色
????????color??=?new?COLOR[n];
????????//?節(jié)點(diǎn)的父節(jié)點(diǎn),非負(fù)整數(shù)
????????parent?=?new?int[n];
????????//?第一個(gè)時(shí)間戳
????????d?=?new?int[n];
????????//?第二個(gè)時(shí)間戳
????????f?=?new?int[n];
????????//?每個(gè)節(jié)點(diǎn)的訪問(wèn)次序
????????ord?=?new?int[n];
????????//?初始化
????????for(int?i?=?0;?i?<?n;?i++){
????????????//將所有頂點(diǎn)的顏色著色為白色
????????????color[i]?=?COLOR.WHITE;
????????????//所有頂點(diǎn)的父母初始化為-1
????????????parent[i]?=?-1;
????????????//所有頂點(diǎn)的深度初始化為無(wú)窮大
????????????d[i]?=?Integer.MAX_VALUE;
????????????f[i]?=?Integer.MAX_VALUE;
????????????//節(jié)點(diǎn)個(gè)訪問(wèn)次序都初始設(shè)為-1
????????????ord[i]?=?-1;
????????}
????????//調(diào)用遞歸函數(shù),進(jìn)行遍歷訪問(wèn)
????????DFS_VISIT(G,?start);
????}

?

??? 函數(shù)DFS首先對(duì)個(gè)頂點(diǎn)顏色、兩個(gè)時(shí)間值以及訪問(wèn)次序等值進(jìn)行初始化,然后調(diào)用遞歸函數(shù)DFS_VISIT對(duì)圖中頂點(diǎn)進(jìn)行深度優(yōu)先搜索。DFS函數(shù)有兩種版本,一種規(guī)定搜索的其實(shí)頂點(diǎn),即上面的代碼,這種實(shí)現(xiàn)只能搜索到給定頂點(diǎn)能到達(dá)的所有頂點(diǎn);另一種不規(guī)定起點(diǎn),這樣能適用于有分離的子圖構(gòu)成的圖的遍歷。下面具體討論遞歸遍歷函數(shù)DFS_VISIT,函數(shù)的實(shí)現(xiàn)如下:

/**
?????*?深度優(yōu)先搜索算法中調(diào)用的遞歸函數(shù),
?????*?實(shí)現(xiàn)圖的遞歸遍歷
?????*?
@param?G????待搜索的圖
?????*?
@param?u?搜索的起點(diǎn)
?????
*/
????static?int?k?=?0;
????public?static?void?DFS_VISIT(Graph?G,?int?u){
????????//?起點(diǎn)u首先著色為灰色
????????color[u]?=?COLOR.GRAY;
????????//?頂點(diǎn)的訪問(wèn)時(shí)間增加1
????????time++;
????????d[u]?=?time;
????????//?打印所有頂點(diǎn)的顏色
????????for(int?i?=?0;?i?<?G.get_nv();?i++){
????????????System.out.print(i?+?")"?+?color[i]?+?"\t");
????????}
????????System.out.println();

????????//?打印并顯示每個(gè)頂點(diǎn)的深度和父頂點(diǎn)
????????for(int?i?=?0;?i?<?G.get_nv();?i++){
????????????String?_4print?=?"";
????????????if(d[i]?<?Integer.MAX_VALUE?
????????????????????&&?f[i]?<?Integer.MAX_VALUE)
????????????????_4print?=?i?+?")"?+?d[i]?+?"/"?+?f[i]?+?"\t";
????????????else?if(d[i]?<?Integer.MAX_VALUE)
????????????????_4print?=?i?+?")"?+?d[i]?+?"/"??+?"\t";
????????????else
????????????????_4print?=?i?+?")"?+?"?"?+?"/"?+?"?"?+?"\t";
????????????System.out.print(_4print);
????????}
????????System.out.println();
????????
????????//?遞歸搜索頂點(diǎn)u的所有尚未訪問(wèn)過(guò)的相鄰頂點(diǎn)
????????for(Edge?w?=?G.firstEdge(u);?
????????????G.isEdge(w);?
????????????w?=?G.nextEdge(w)){
????????????if(color[w.get_v2()]?==?COLOR.WHITE){
????????????????parent[w.get_v2()]?=?u;
????????????????DFS_VISIT(G,?w.get_v2());
????????????}
????????}
????????
????????//?將u其顏色改變?yōu)楹谏?/span>
????????color[u]?=?COLOR.BLACK;
????????//?頂點(diǎn)訪問(wèn)結(jié)束時(shí)的時(shí)間
????????f[u]?=?++time;
????????//?頂點(diǎn)被訪問(wèn)的次序
????????ord[u]?=?k++;
????????//?打印各個(gè)頂點(diǎn)的顏色
????????for(int?i?=?0;?i?<?G.get_nv();?i++){
????????????System.out.print(i?+?")"?+?color[i]?+?"\t");
????????}
????????System.out.println();
????????
????????//?打印各個(gè)頂點(diǎn)被訪問(wèn)的起始、結(jié)束時(shí)間
????????for(int?i?=?0;?i?<?G.get_nv();?i++){
????????????String?_4print?=?"";
????????????if(d[i]?<?Integer.MAX_VALUE?
????????????????????&&?f[i]?<?Integer.MAX_VALUE)
????????????????_4print?=?i?+?")"?+?d[i]?+?"/"?+?f[i]?+?"\t";
????????????else?if(d[i]?<?Integer.MAX_VALUE)
????????????????_4print?=?i?+?")"?+?d[i]?+?"/"??+?"\t";
????????????else
????????????????_4print?=?i?+?")"?+?"?"?+?"/"?+?"?"?+?"\t";
????????????System.out.print(_4print);
????????}
????????System.out.println();
????}

?

??? DFS_VISIT函數(shù)在執(zhí)行時(shí)首先對(duì)本次遞歸調(diào)用的時(shí)間值time進(jìn)行更新,將其作為入?yún)㈨旤c(diǎn)u的第一時(shí)間d[u];然后將頂點(diǎn)u的顏色重置為灰色。函數(shù)關(guān)鍵的步驟為遞歸地對(duì)搜索頂點(diǎn)u的每一個(gè)相鄰頂點(diǎn),首先搜索第一個(gè)尚未被訪問(wèn)的相鄰點(diǎn),然后回溯至頂點(diǎn)u并遞歸搜索第二個(gè)尚未被訪問(wèn)的相鄰點(diǎn)。如果頂點(diǎn)的相鄰頂點(diǎn)為白色,則該頂點(diǎn)尚未被訪問(wèn)。頂點(diǎn)u的所有相鄰頂點(diǎn)都被訪問(wèn)后將u頂點(diǎn)的著色重置為黑色,并記錄第二個(gè)時(shí)間f[u]為此時(shí)的時(shí)間time。

以有向圖圖(b)為例來(lái)分析深度優(yōu)先算法的過(guò)程,測(cè)試兩種遍歷過(guò)程,第一種設(shè)定搜索的起點(diǎn)為頂點(diǎn)0,搜索頂點(diǎn)0能到達(dá)的所有頂點(diǎn);第二種不設(shè)定頂點(diǎn),搜索圖中所有頂點(diǎn)。有向圖的邊信息如下:

6

0,1,1

0,3,1

1,4,1

2,4,1

2,5,1

3,1,1

4,3,1

5,5,1

測(cè)試示例代碼為:

?

?

GraphLnk?GL?=?
????????????Utilities.BulidGraphLnkFromFile("Graph\\graph2.txt");
????????System.out.println("頂點(diǎn)0作為起點(diǎn)深度優(yōu)先搜索結(jié)果:");
????????GraphSearch.DFS(GL,?0);
????????System.out.println();
????????System.out.println("無(wú)起始頂點(diǎn)深度優(yōu)先搜索結(jié)果:");
????????GraphSearch.DFS(GL);

?

運(yùn)行結(jié)果為:

頂點(diǎn)0作為起點(diǎn)深度優(yōu)先搜索結(jié)果:

0)GRAY1)WHITE2)WHITE3)WHITE4)WHITE5)WHITE

0)1/1)?/?2)?/?3)?/?4)?/?5)?/?

0)GRAY1)GRAY2)WHITE3)WHITE4)WHITE5)WHITE

0)1/1)2/2)?/?3)?/?4)?/?5)?/?

0)GRAY1)GRAY2)WHITE3)WHITE4)GRAY5)WHITE

0)1/1)2/2)?/?3)?/?4)3/5)?/?

0)GRAY1)GRAY2)WHITE3)GRAY4)GRAY5)WHITE

0)1/1)2/2)?/?3)4/4)3/5)?/?

0)GRAY1)GRAY2)WHITE3)BLACK4)GRAY5)WHITE

0)1/1)2/2)?/?3)4/54)3/5)?/?

0)GRAY1)GRAY2)WHITE3)BLACK4)BLACK5)WHITE

0)1/1)2/2)?/?3)4/54)3/65)?/?

0)GRAY1)BLACK2)WHITE3)BLACK4)BLACK5)WHITE

0)1/1)2/72)?/?3)4/54)3/65)?/?

0)BLACK1)BLACK2)WHITE3)BLACK4)BLACK5)WHITE

0)1/81)2/72)?/?3)4/54)3/65)?/?

無(wú)起始頂點(diǎn)深度優(yōu)先搜索結(jié)果:

0)GRAY1)WHITE2)WHITE3)WHITE4)WHITE5)WHITE

0)1/1)?/?2)?/?3)?/?4)?/?5)?/?

0)GRAY1)GRAY2)WHITE3)WHITE4)WHITE5)WHITE

0)1/1)2/2)?/?3)?/?4)?/?5)?/?

0)GRAY1)GRAY2)WHITE3)WHITE4)GRAY5)WHITE

0)1/1)2/2)?/?3)?/?4)3/5)?/?

0)GRAY1)GRAY2)WHITE3)GRAY4)GRAY5)WHITE

0)1/1)2/2)?/?3)4/4)3/5)?/?

0)GRAY1)GRAY2)WHITE3)BLACK4)GRAY5)WHITE

0)1/1)2/2)?/?3)4/54)3/5)?/?

0)GRAY1)GRAY2)WHITE3)BLACK4)BLACK5)WHITE

0)1/1)2/2)?/?3)4/54)3/65)?/?

0)GRAY1)BLACK2)WHITE3)BLACK4)BLACK5)WHITE

0)1/1)2/72)?/?3)4/54)3/65)?/?

0)BLACK1)BLACK2)WHITE3)BLACK4)BLACK5)WHITE

0)1/81)2/72)?/?3)4/54)3/65)?/?

0)BLACK1)BLACK2)GRAY3)BLACK4)BLACK5)WHITE

0)1/81)2/72)9/3)4/54)3/65)?/?

0)BLACK1)BLACK2)GRAY3)BLACK4)BLACK5)GRAY

0)1/81)2/72)9/3)4/54)3/65)10/

0)BLACK1)BLACK2)GRAY3)BLACK4)BLACK5)BLACK

0)1/81)2/72)9/3)4/54)3/65)10/11

0)BLACK1)BLACK2)BLACK3)BLACK4)BLACK5)BLACK

0)1/81)2/72)9/123)4/54)3/65)10/11

結(jié)果中每?jī)尚袨橐粋€(gè)狀態(tài),第一行為個(gè)頂點(diǎn)的顏色,第二行為個(gè)頂點(diǎn)的兩個(gè)時(shí)間:d[u]/f[u]。程序運(yùn)行流程如下:

?

?

?

?

設(shè)定起始頂點(diǎn)為0時(shí),算法只能搜索到圖中頂點(diǎn)0可到達(dá)的所有頂點(diǎn),即頂點(diǎn)1,4,3,其過(guò)程為上圖步驟1~8。不設(shè)定起始頂點(diǎn)時(shí),可以搜索到圖中所有頂點(diǎn)。

前面我們提到,深度優(yōu)先搜索所獲得每個(gè)頂點(diǎn)的兩個(gè)時(shí)間d和f蘊(yùn)含了圖的結(jié)構(gòu)信息,即所謂的“括號(hào)對(duì)結(jié)構(gòu)”(parenthesis?structure)。根據(jù)最終得到的各頂點(diǎn)的時(shí)間d和時(shí)間f,可以得到如圖(a,?b)所示的括號(hào)結(jié)構(gòu),其中圖(b)中對(duì)各頂點(diǎn)的位置做了調(diào)整。

?

?

?

?

圖?深度優(yōu)先搜索算法得到的括號(hào)對(duì)結(jié)構(gòu)

另一方面,根據(jù)算法獲得的各頂點(diǎn)的父頂點(diǎn)數(shù)組parent[],可以構(gòu)造深度優(yōu)先搜索森林。對(duì)圖(b)所有頂點(diǎn)進(jìn)行深度優(yōu)先搜索得到的父頂點(diǎn)數(shù)組為:

-1,?0,?-1,?4,?1,?2,

可以構(gòu)造出如圖所示的深度優(yōu)先森林。可以發(fā)現(xiàn)括號(hào)對(duì)結(jié)構(gòu)和深度優(yōu)先森林之間存在對(duì)應(yīng)關(guān)系。如果頂點(diǎn)v和頂點(diǎn)u的搜索訪問(wèn)時(shí)間滿足條件d[u]<d[v]<f[v]<d[u],那么頂點(diǎn)v必然是頂點(diǎn)u的后裔。具體證明請(qǐng)讀者參閱相關(guān)圖論書籍。

?

圖?深度優(yōu)先森林

廣度優(yōu)先搜索和深度優(yōu)先搜索算法將多次應(yīng)用到下面即將介紹的算法中。

轉(zhuǎn)載于:https://www.cnblogs.com/ajian005/archive/2012/11/08/2841158.html

總結(jié)

以上是生活随笔為你收集整理的6.1 图的深度优先和广度优先搜索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。