2 回答

TA貢獻1851條經驗 獲得超3個贊
貪心過程.
首先,把圖中的點分成兩種,已連通和未連通的,我把它們分別稱為"黑"和"白"點.
一開始時,圖中全是白點,沒有黑點.算法的第一步,隨機選出一個白點,染成黑色.
然后開始一個重復的過程:
從當前圖的邊中尋找這樣的一些邊:它的其中一個端點是黑點,而另一個端點是一個白點. 我們可以把這類邊稱為"可擴展邊". 然后算法需要從所有的可擴展邊之中選出權值最小的一條.把這條可擴展邊加入生成樹之中,且把這條邊的白色端點染成黑色.
重復這個過程,直到全部的節點都為黑色.
算法可以優化的地方是,在選擇權值最小的可行邊時可以使用堆.

TA貢獻1818條經驗 獲得超11個贊
G=(V,E)
①初始化:讀入的數據用鄰接矩陣x存儲,一個一維布爾型數組chosen,記錄第i個節點是否已選,初始值除1外全部設為false,記錄權值的變量cost賦值為0;
以下②到④循環執行v-1次(每次生成一條邊,運行(點的個數減1)次后,生成一棵最小生成樹):
②臨時變量p賦值為無限大,用于記錄當前最小值;
③二重循環(外循環i,內循環j)掃描鄰接矩陣:如果chosen[i]=true(也就是說第i個點已選),那么掃描x[i],如果not(chosen[j])(也就是說第j個點未選),那么如果x[i,j]<p,那么p賦值為x[i,j],臨時變量q賦值為j;
④把cost賦值為cost+o,把chosen[q]賦值為true(也就是說第j個點已選);
⑤輸出cost。
一、以上給出具體的運行過程。這個算法的策略就是貪心,和dijkstra差不多,每次都選擇未選的邊中權值最小的那一條,直到生成最小生成樹。用chosen的目的就是保證生成過程中沒有環出現,也就是說保證選擇的邊不會通向一個已經包含在生成樹中的點。
二、這個只輸出最小生成樹的每條邊權值之和,如果要輸出整棵最小生成樹,加一個[1..n,1..2]的數組,在第④步的時候把每次選的邊記錄下來就可以了。
三、用小頂堆在第③步優化一下的話就不用每次都掃描那么多邊了,只不過建堆維護堆代碼寫起來很麻煩。
四、prim適合用于比較稠密的網,點數和邊數差不多的時候效率很惡心,一般都用kruskal。
添加回答
舉報