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

            常用鏈接

            統計

            最新評論

            最小生成樹之Prim算法

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

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

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

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

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

            看看代碼,分析分析吧。。記住很重要的,自己舉個例子看看。最后一定要熟練掌握其原理,并且快速的寫出代碼。
            #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){//選擇最優點
                    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;
                }

              }

            }

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

















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

            香蕉久久久久久狠狠色| 久久婷婷五月综合国产尤物app| 久久人人爽人人爽人人片AV麻豆| 91精品国产色综久久 | 国产激情久久久久影院老熟女免费 | 久久国产精品无码一区二区三区| 2022年国产精品久久久久| 91久久精品国产成人久久| 国内精品久久久久久中文字幕| 一97日本道伊人久久综合影院| 精品无码久久久久久尤物| 人妻无码久久精品| 久久综合中文字幕| 久久久亚洲欧洲日产国码aⅴ| 国产精品久久波多野结衣| 久久久久国色AV免费观看| 久久99国产精品久久久| 色婷婷综合久久久久中文一区二区 | 久久国产精品99久久久久久老狼| 久久精品女人天堂AV麻| 久久久久久久97| 久久天天婷婷五月俺也去| 777米奇久久最新地址| 久久精品国产免费观看| 狠狠精品干练久久久无码中文字幕 | 日产精品99久久久久久| 日本精品一区二区久久久| 久久国产亚洲高清观看| 国产亚洲精品久久久久秋霞 | 88久久精品无码一区二区毛片 | 久久WWW免费人成一看片| 精品久久久久久无码中文字幕| 国产精品久久久久久| 久久夜色精品国产噜噜麻豆 | 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久精品国产亚洲麻豆| 久久热这里只有精品在线观看| 国产亚洲美女精品久久久| 久久久久综合网久久| 日韩精品国产自在久久现线拍| 久久99热国产这有精品|