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

            久久99亚洲网美利坚合众国| 国产精品久久久久久| 久久这里都是精品| 国产成人综合久久综合| 日韩精品久久久久久| 久久涩综合| 亚洲国产精品无码久久久不卡| 亚洲精品高清一二区久久| 狠狠色狠狠色综合久久| 人人狠狠综合久久亚洲婷婷| 免费精品久久久久久中文字幕 | 久久99国产精品久久| 精品国产一区二区三区久久蜜臀| 中文字幕久久精品| 97热久久免费频精品99| 无码人妻久久一区二区三区蜜桃 | 四虎国产永久免费久久| 国产成人精品久久| 中文精品久久久久人妻| 91精品国产色综久久 | 久久综合九色欧美综合狠狠| 99久久无色码中文字幕| 亚洲成人精品久久| 久久久久久久综合日本亚洲| 精品久久久久久国产潘金莲| 久久se精品一区精品二区| 国产高潮国产高潮久久久91 | 久久综合久久久| 99久久99久久精品国产片| 色综合久久88色综合天天| 国产精品免费看久久久| 久久国产精品久久精品国产| 久久99久久成人免费播放| 国产99久久精品一区二区| 国产免费久久久久久无码| 99久久国产综合精品成人影院| 久久无码精品一区二区三区| 久久伊人色| 欧美激情精品久久久久久久| 99精品国产99久久久久久97| 国产精品久久久久久久久久免费|