• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            醬壇子

            專注C++技術(shù) 在這里寫下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進步(歡迎批評!!?。?/p>

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

            公告

            王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專業(yè)

            常用鏈接

            留言簿(19)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 388622
            • 排名 - 64

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            寬度優(yōu)先搜索 BFS

            寬度優(yōu)先搜索算法(又稱廣度優(yōu)先搜索)是最簡便的圖的搜索算法之一,這一算法也是很多重要的圖的算法的原型。Dijkstra單源最短路徑算法和Prim最小生成樹算法都采用了和寬度優(yōu)先搜索類似的思想。

            已知圖G=(V,E)和一個源頂點s,寬度優(yōu)先搜索以一種系統(tǒng)的方式探尋G的邊,從而“發(fā)現(xiàn)”s所能到達的所有頂點,并計算s到所有這些頂點的距離(最少邊數(shù)),該算法同時能生成一棵根為s且包括所有可達頂點的寬度優(yōu)先樹。對從s可達的任意頂點v,寬度優(yōu)先樹中從s到v的路徑對應(yīng)于圖G中從s到v的最短路徑,即包含最小邊數(shù)的路徑。該算法對有向圖和無向圖同樣適用。

            之所以稱之為寬度優(yōu)先算法,是因為算法自始至終一直通過已找到和末找到頂點之間的邊界向外擴展,就是說,算法首先搜索和s距離為k的所有頂點,然后再去搜索和S距離為k+l的其他頂點。

            為了保持搜索的軌跡,寬度優(yōu)先搜索為每個頂點著色:白色、灰色或黑色。算法開始前所有頂點都是白色,隨著搜索的進行,各頂點會逐漸變成灰色,然后成為黑色。在搜索中第一次碰到一頂點時,我們說該頂點被發(fā)現(xiàn),此時該頂點變?yōu)榉前咨旤c。因此,灰色和黑色頂點都已被發(fā)現(xiàn),但是,寬度優(yōu)先搜索算法對它們加以區(qū)分以保證搜索以寬度優(yōu)先的方式執(zhí)行。若(u,v)∈E且頂點u為黑色,那么頂點v要么是灰色,要么是黑色,就是說,所有和黑色頂點鄰接的頂點都已被發(fā)現(xiàn)?;疑旤c可以與一些白色頂點相鄰接,它們代表著已找到和未找到頂點之間的邊界。

            在寬度優(yōu)先搜索過程中建立了一棵寬度優(yōu)先樹,起始時只包含根節(jié)點,即源頂點s.在掃描已發(fā)現(xiàn)頂點u的鄰接表的過程中每發(fā)現(xiàn)一個白色頂點v,該頂點v及邊(u,v)就被添加到樹中。在寬度優(yōu)先樹中,我們稱結(jié)點u 是結(jié)點v的先輩或父母結(jié)點。因為一個結(jié)點至多只能被發(fā)現(xiàn)一次,因此它最多只能有--個父母結(jié)點。相對根結(jié)點來說祖先和后裔關(guān)系的定義和通常一樣:如果u處于樹中從根s到結(jié)點v的路徑中,那么u稱為v的祖先,v是u的后裔。

            下面的寬度優(yōu)先搜索過程BFS假定輸入圖G=(V,E)采用鄰接表表示,對于圖中的每個頂點還采用了幾種附加的數(shù)據(jù)結(jié)構(gòu),對每個頂點u∈V,其色彩存儲于變量color[u]中,結(jié)點u的父母存于變量π[u]中。如果u沒有父母(例如u=s或u還沒有被檢索到),則 π[u]=NIL,由算法算出的源點s和頂點u之間的距離存于變量d[u]中,算法中使用了一個先進先出隊列Q來存放灰色節(jié)點集合。其中head[Q]表示隊列Q的隊頭元素,Enqueue(Q,v)表示將元素v入隊, Dequeue(Q)表示對頭元素出隊;Adj[u]表示圖中和u相鄰的節(jié)點集合。

            procedure BFS(G,S);

            begin

            1.   for 每個節(jié)點u∈V[G]- do

            begin

            2.        color[u]←White;

            3.        d[u]←∞;

            4.        π[u]←NIL;

            end;

            5.   color[s]←Gray;

            6.   d[s]←0;

            7.   π[s]←NIL;

            8.   Q←

            9.   while Q≠φ do

            begin

            10.      u←head[Q];

            11.      for 每個節(jié)點v∈Adj[u] do

            12.        if color[v]=White then

            begin

            13.             color[v]←Gray;        

            14.             d[v]←d[v]+1;

            15.             π[v]←u;

            16.             Enqueue(Q,v);

            end;   

            17.      Dequeue(Q);

            18.      color[u]←Black;

            end;

            end;

            圖1展示了用BFS在例圖上的搜索過程。黑色邊是由BFS產(chǎn)生的樹枝。每個節(jié)點u內(nèi)的值為d[u],圖中所示的隊列Q是第9-18行while循環(huán)中每次迭代起始時的隊列。隊列中每個結(jié)點下面是該結(jié)點與源結(jié)點的距離。

            圖1 BFS在一個無向圖上的執(zhí)行過程

            過程BFS按如下方式執(zhí)行,第1-4行置每個結(jié)點為白色,置d[u]為無窮大,每個結(jié)點的父母置為NIL,第5行置源結(jié)點S為灰色,即意味著過程開始時源結(jié)點已被發(fā)現(xiàn)。第6行初始化d[s]為0,第7行置源結(jié)點的父母結(jié)點為NIL,第8行初始化隊列0,使其僅含源結(jié)點s,以后Q隊列中僅包含灰色結(jié)點的集合。

            程序的主循環(huán)在9-18行中,只要隊列Q中還有灰色結(jié)點,即那些已被發(fā)現(xiàn)但還沒有完全搜索其鄰接表的結(jié)點,循環(huán)將一直進行下去。第10行確定隊列頭的灰色結(jié)點為u。第11-16行的循環(huán)考察u的鄰接表中的每一個頂點v。如果v是白色結(jié)點,那么該結(jié)點還沒有被發(fā)現(xiàn)過,算法通過執(zhí)行第13-16行發(fā)現(xiàn)該結(jié)點。首先它被置為灰色,距離d[v]置為d[u]+1,而后u被記為該節(jié)點的父母,最后它被放在隊列Q的隊尾。當(dāng)結(jié)點u的鄰接表中的所有結(jié)點都被檢索后,第17 -18行使u彈出隊列并置成黑色。

            分析

            在證明寬度優(yōu)先搜索的各種性質(zhì)之前,我們先做一些相對簡單的工作 ——分析算法在圖G=(V,E)之上的運行時間。在初始化后,再沒有任何結(jié)點又被置為白色。因此第12行的測試保證每個結(jié)點至多只能迸人隊列一次,因而至多只能彈出隊列一次。入隊和出隊操作需要O(1)的時間,因此隊列操作所占用的全部時間為O(V),因為只有當(dāng)每個頂點將被彈出隊列時才會查找其鄰接表,因此每個頂點的鄰接表至多被掃描一次。因為所有鄰接表的長度和為Q(E),所以掃描所有鄰接表所花費時間至多為O(E)。初始化操作的開銷為O(V),因此過程BFS的全部運行時間為O(V+E),由此可見,寬度優(yōu)先搜索的運行時間是圖的鄰接表大小的一個線性函數(shù)。
            posted on 2007-04-13 16:20 @王一偉 閱讀(1387) 評論(2)  編輯 收藏 引用

            Feedback

            # re: 寬度優(yōu)先搜索 2007-04-15 11:20 Corner Zhang
            你那個“圖1”在哪呢?  回復(fù)  更多評論
              

            # re: 寬度優(yōu)先搜索 2007-04-15 11:33 醬菜
            HOHO 網(wǎng)上也沒有 直接拖過來的  回復(fù)  更多評論
              


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            韩国免费A级毛片久久| 久久国产视屏| 国产精品久久国产精品99盘| 91精品国产综合久久婷婷| 久久免费视频网站| 国产精品久久新婚兰兰 | 国产成人久久777777| 日本亚洲色大成网站WWW久久| 人妻精品久久久久中文字幕69 | 久久国产亚洲精品无码| 久久久久久亚洲精品无码| 99久久综合狠狠综合久久止| 亚洲国产成人久久综合野外| 99久久综合狠狠综合久久止| 人妻无码αv中文字幕久久琪琪布| www.久久精品| 久久亚洲精精品中文字幕| 综合久久给合久久狠狠狠97色 | 久久久久波多野结衣高潮| 国产精品内射久久久久欢欢| 99久久婷婷国产综合亚洲| 亚洲中文久久精品无码| 久久亚洲精品国产亚洲老地址| 色综合久久综精品| 亚洲一区中文字幕久久| 成人久久久观看免费毛片| 亚洲精品无码久久一线| 免费精品国产日韩热久久| 久久中文字幕精品| 2020久久精品亚洲热综合一本| 久久夜色精品国产| 亚洲国产精品热久久| 91精品免费久久久久久久久| 国产精品久久国产精麻豆99网站| 国产亚洲综合久久系列| MM131亚洲国产美女久久| 久久亚洲春色中文字幕久久久 | 99久久婷婷国产综合亚洲| 99国产欧美精品久久久蜜芽| 狠色狠色狠狠色综合久久| 国产精品美女久久久免费|