• <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>

            yuanyuelang

            常用鏈接

            統(tǒng)計

            最新評論

            最小生成樹之Prim算法

            最小生成樹是圖論的一個重要部分,解決這個問題的算法主要有Kruskal算法和Prim算法。

            最小生成樹:顧名思義是一棵樹,該樹是圖中權值和最小的。

            這篇文章介紹Prim算法,Kruskal算法請參閱最小生成樹之Kruskal算法

            Prim算法的主要思路:
            1.圖G={V,E},V表示節(jié)點集,E表示邊集,初始時將V0從V中拿出,放入空集合U中,U={V0},T(E)空
            2.選擇和集合U有連接的且最近的點Vx(在V中),放入U,U={V0,Vx},并將邊加入到T(E)中。
            3.重復第二步,直到U=V
            很明顯需要n-1步,n為圖的節(jié)點數(shù)。

            現(xiàn)在我們就是要如何把它變成代碼的問題了。
            1.存儲問題,我們需要一個二元數(shù)組graph下標存放節(jié)點,數(shù)組值存放權值。比如(1,2)有邊,權值為3,則graph[1][2]=3,同時graph[2][1]=3,沒有邊的點用INF(無窮大)表示咯。
            2.如何判斷和最近的點,由于每一次進來都會改變情況,所以每次都要更新,我們用一個一元數(shù)組opt[n]來表示,數(shù)組下標表示節(jié)點號,值表示該節(jié)點到U的最短距離。記住,加入到U集合的點是不用再管它的了,所以,我們還要設置一個數(shù)組flag[n],來設置標志位,看是否已經加入到U集合了。
            3.這樣的話大功也就告成了,一般就會寫了吧。如果要保存各個邊的話,還要添加一個數(shù)組line[n]來表示節(jié)點到U的最短距離到底是連接U中哪一個節(jié)點的。

            看看代碼,分析分析吧。。記住很重要的,自己舉個例子看看。最后一定要熟練掌握其原理,并且快速的寫出代碼。
            #define MAXN 100
            #define INF 0xfffffff

            int result_s[MAXN],result_e[MAXN];//保存邊

            void prim(int graph[MAXN][MAXN],int opt[],int n)
            {
              
            int i,j,min,vertex,line[n];
              
            bool flag[n];
             
              
            for(i=0;i<n;i++)//初始化
                opt[i]=graph[0][i];
                line[i]
            =0;
                flag[i]
            =false;
               }

              flag[
            0]=true;
              
            for(i=1;i<n;i++){
                min
            =INF;
                
            for(j=1;j<n;j++){
                  
            if(!flag[j]&&opt[j]<min){//選擇最優(yōu)點
                    min=opt[j];
                    vertex
            =j;
                  }

                }

                flag[vertex]
            =true//加入到U集合
                result_s[i]=line[vertex];//保存
                result_e[i]=vertex;
                
            for(j=1;j<n;j++){//更新
                  if(!flag[j]&&graph[vertex][j]<opt[j])
                     opt[j]
            =graph[vertex][j];
                     line[j]
            =vertex;
                }

              }

            }

            因為代碼是自己當場寫出來,寫出來和原來正確代碼相比較了,如果讀者發(fā)現(xiàn)有錯,還望指正。
            我想我們就是要鍛煉這種寫代碼的能力,不能太依靠模板,不然忘得快。
            注意:最后結果都知道了,opt[]保存的是最小生成樹的選入的各個邊的權值,result_s[]和result_e保存了到底是哪些點組成的最小生成樹。

















            posted on 2009-09-14 18:47 原語餓狼 閱讀(523) 評論(0)  編輯 收藏 引用 所屬分類: 圖論

            成人妇女免费播放久久久| 久久无码AV中文出轨人妻| 99久久成人国产精品免费| 国产麻豆精品久久一二三| 国产日产久久高清欧美一区| 97久久久精品综合88久久| 国内精品久久久久久久亚洲| 激情综合色综合久久综合| 久久久WWW免费人成精品| 中文字幕久久精品无码| 99久久这里只有精品| 国产精品激情综合久久| 狠狠综合久久AV一区二区三区| 久久国产色AV免费观看| 久久99久久成人免费播放| 三级韩国一区久久二区综合| 久久人人爽人爽人人爽av| 国产成人精品综合久久久| 99热都是精品久久久久久| 99久久精品无码一区二区毛片 | 久久精品国产亚洲欧美| 欧美日韩中文字幕久久伊人| www.久久99| 亚洲AV日韩精品久久久久久久| 国产午夜精品久久久久九九| 国产A三级久久精品| 热RE99久久精品国产66热| 99999久久久久久亚洲| 婷婷综合久久中文字幕蜜桃三电影 | 99久久人人爽亚洲精品美女| 国内精品九九久久久精品| 狠狠精品久久久无码中文字幕 | 婷婷久久综合九色综合98| 久久精品亚洲AV久久久无码| 久久影视综合亚洲| 久久亚洲天堂| 日韩人妻无码精品久久免费一| 久久综合狠狠色综合伊人| 麻豆一区二区99久久久久| 国产精品禁18久久久夂久| 久久精品国产第一区二区三区|