• <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)  編輯 收藏 引用 所屬分類: 圖論

            色综合久久综合网观看| 久久se精品一区二区影院 | 99热成人精品免费久久| 99久久免费国产特黄| 午夜视频久久久久一区| 久久se精品一区精品二区| 久久精品国产男包| 欧美激情精品久久久久久久| 亚洲人成精品久久久久| 色综合久久中文字幕综合网| 久久久久久久尹人综合网亚洲 | 日产精品久久久久久久| 大香网伊人久久综合网2020| 人妻精品久久无码区| 色婷婷综合久久久久中文| 久久亚洲私人国产精品vA| 精品久久久久久亚洲精品| 国产午夜免费高清久久影院| 大伊人青草狠狠久久| 国产日韩欧美久久| 怡红院日本一道日本久久 | 韩国无遮挡三级久久| 国产一区二区精品久久| 久久毛片免费看一区二区三区| 久久精品一区二区三区中文字幕| 亚洲AV伊人久久青青草原| 日韩人妻无码精品久久免费一| 精品久久777| 综合人妻久久一区二区精品| 久久久久久狠狠丁香| 国色天香久久久久久久小说| 狠狠人妻久久久久久综合蜜桃| 亚洲国产成人久久综合碰| 久久久久亚洲Av无码专| 午夜精品久久久久久| 久久久久久国产精品无码下载| 久久久久久久综合狠狠综合| 精品久久久久久综合日本| 韩国三级中文字幕hd久久精品| 亚洲国产一成人久久精品| 国产成人精品久久一区二区三区av |