• <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久久精品国产综合一区| 无码任你躁久久久久久| 亚洲国产美女精品久久久久∴| 久久久久亚洲av无码专区导航| 国产精品成人精品久久久 | 久久久久久九九99精品| 99久久国产综合精品网成人影院| 久久久久久亚洲精品影院| 国产精品无码久久综合| 一本色道久久综合| 国产精品免费久久| 国产精品免费福利久久| 97视频久久久| 久久精品国产一区二区电影| 久久久无码人妻精品无码| 精品久久久久久久久免费影院| 91亚洲国产成人久久精品网址| 婷婷久久香蕉五月综合加勒比| 亚洲午夜无码久久久久小说| 欧美激情精品久久久久| 国产亚洲综合久久系列| 久久久久亚洲av无码专区| 久久久久精品国产亚洲AV无码| 久久乐国产精品亚洲综合| 亚洲AV无一区二区三区久久 | 欧洲性大片xxxxx久久久| 久久精品国产91久久综合麻豆自制 | 99久久精品免费看国产一区二区三区 | 久久久久免费精品国产| 东京热TOKYO综合久久精品| 少妇无套内谢久久久久| 欧美亚洲国产精品久久高清 | 2021久久精品国产99国产精品| 亚洲精品乱码久久久久久按摩 | 久久久久久久综合日本| 久久丝袜精品中文字幕| 一级做a爰片久久毛片毛片| 久久久久久综合网天天| 香蕉久久夜色精品升级完成| 99久久精品国产免看国产一区|