JAVA—咖啡館

          ——?dú)g迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請(qǐng)與我聯(lián)系。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          圖中代權(quán)的最小樹的問題如下:


          如果N個(gè)城市之間(圖中的頂點(diǎn))要修公路(圖中的邊)以使所有的城市聯(lián)通,求怎樣修可以使得公路的總長(zhǎng)最小?
          以上問題中的N個(gè)城市之間可以用圖中的頂點(diǎn)表示,公路可以圖中的邊表示,公路的長(zhǎng)度用邊長(zhǎng)表示,公路是雙向的。問題就轉(zhuǎn)換為在有N個(gè)頂點(diǎn)中的雙向代權(quán)圖中求得一個(gè)最小樹。這里的代權(quán)指的邊的長(zhǎng)度,這與以前的不代權(quán)的最小樹生成算法有很大的區(qū)別。


          算法描述如下:


              任選一個(gè)節(jié)點(diǎn)開始,將該節(jié)點(diǎn)標(biāo)志為已訪問過的節(jié)點(diǎn)。也就是最小樹中的節(jié)點(diǎn)。并設(shè)置為當(dāng)前節(jié)點(diǎn)。
              1 尋找此訪問節(jié)點(diǎn)的所有的鄰接頂點(diǎn),將邊置入優(yōu)先隊(duì)列。鄰接頂點(diǎn)不考慮已標(biāo)志為訪問的節(jié)點(diǎn),因?yàn)樗言诮Y(jié)果中。
              2 重復(fù) 步驟1 直到?jīng)]有新的邊被發(fā)現(xiàn)。此時(shí)在所有發(fā)現(xiàn)的邊中找到最小的邊,將其終點(diǎn)頂點(diǎn)標(biāo)志為已訪問,放入最小樹中。并設(shè)置為當(dāng)前節(jié)點(diǎn)
              3 重復(fù) 步驟 1,2,直到邊的隊(duì)列中沒有多余的邊,算法結(jié)束。

              注意:這里的優(yōu)先級(jí)隊(duì)列是個(gè)修正過的優(yōu)先級(jí)隊(duì)列,每次向該隊(duì)列中加入一條新邊時(shí)后,會(huì)檢查是否有與新邊終點(diǎn)相同的第二條邊的存在,如果有,則刪除邊長(zhǎng)較大的邊。因?yàn)槿绻嬖谶@樣的邊說明,有兩條從已訪問過節(jié)點(diǎn)到相同目標(biāo)節(jié)點(diǎn)的路徑存在,如果這樣的話只用保留最小的那條邊即可。

          這里的圖采用Graph 圖-鄰接矩陣法 表示。



          算法實(shí)際上是作如下操作:


              先準(zhǔn)備好一個(gè)優(yōu)先級(jí)隊(duì)列,里面以邊長(zhǎng)為關(guān)鍵值存放邊,邊的起點(diǎn)表示已被訪問過的節(jié)點(diǎn),而邊的終點(diǎn)表示未訪問的節(jié)點(diǎn)。將某節(jié)點(diǎn)標(biāo)志為訪問過節(jié)點(diǎn)。開始算法。
              尋找該訪問過節(jié)點(diǎn)的所有邊,并記錄邊長(zhǎng),放入邊優(yōu)先級(jí)隊(duì)列中;
              找到所有從已訪問過的節(jié)點(diǎn)到未訪問節(jié)點(diǎn)的邊中的最小邊;
              將最小邊連接的頂點(diǎn)設(shè)置為訪問過,重復(fù)以上過程,直到所有節(jié)點(diǎn)都變成已訪問。

          主要的類如下:

              Edge:記載邊

              PriorityQ:修正后的優(yōu)先級(jí)隊(duì)列

              Vertex:頂點(diǎn)

              Gragh:圖

                  Gragh.mstw():最小樹生成算法

                  Gragh.main():提供簡(jiǎn)單測(cè)試

          代碼如下:

           

          JAVA代碼

           

          posted on 2008-05-28 15:45 rogerfan 閱讀(418) 評(píng)論(0)  編輯  收藏 所屬分類: 【JAVA算法】
          主站蜘蛛池模板: 隆化县| 宜丰县| 梁山县| 边坝县| 宜城市| 措勤县| 柘荣县| 略阳县| 轮台县| 蒙城县| 桃源县| 苍山县| 东兰县| 禹州市| 自治县| 綦江县| 南溪县| 湖口县| 宁城县| 兰溪市| 盖州市| 松原市| 洛浦县| 措勤县| 无锡市| 榆林市| 沈阳市| 县级市| 拜泉县| 鹤山市| 白山市| 定安县| 清苑县| 荣昌县| 阿拉善左旗| 九台市| 金寨县| 瑞金市| 青阳县| 洪泽县| 含山县|