Prim演算法 Kruskal演算法

2021-08-13 03:57:03 字數 2223 閱讀 5366

一、prim演算法

1、要求:

(1)生成一顆連通的樹

(2)生成樹:包含全部頂點,v-1條邊,沒有迴路,並且新增一條邊會變成有迴路

(3)權重和最小

2、過程模擬

最重要:貪心的思想,每一步都要選擇權值最小的,這棵樹所有跟頂點相連的邊中最小的。從根節點開始,讓樹慢慢的長大。

過程:

從v1開始

跟v1有聯絡的是4,2,1,選擇1,所以到了v4

現在可以選擇的邊有,跟v1相連線的4,2,跟v4連線的2,8,4,7,3,選擇最小的2,選哪個都可以,這裡選v2

現在有三個頂點了,v1有4,v2有10,v4有2,8,4,7,選擇2,所以從v4連到v3

一直這樣做,直到所有頂點訪問完

3、思想

每次應該選擇哪條邊?用dist陣列來解決。dist儲存每個樹外邊的頂點vi到樹頂點的集合v的最小的距離,還是用圖演示。先從v1開始,樹裡邊只有v1,所以各個頂點到樹最短的距離dist[i],就是我們看到的4,1,2,還有一些沒有連線上的(用無窮大表示)

接著把v4收進去,那麼比如說v3到樹的距離,就要更新,原來它到樹的最短距離是4(就是到v1的距離),現在dist[3]變得更短了,變成了2(到v4最近)

就這樣每次都更新出這個時刻,每個頂點跟樹最近的距離,然後在這裡距離中選取最短的那個邊,把這個邊上的頂點收進去

//不要看這個,這個是我的思路,估計只有我能看懂

從v0開始尋找

for()

建立乙個鄰接表lgraph來儲存樹

while(1)

}}}if(所有的點都訪問了)else

4、**

/*作用:鄰接矩陣最小生成樹

使用變數:用dist來描述樹外邊的頂點到樹的最短距離、用 vcount刻畫收錄了多少個頂點、

用parent描述,樹外邊的頂點到這棵樹哪個頂點最近

更新:每次訪問完乙個結點,vcount,dist,parent都要更新*/

lgraph prim_matric(mgraph graph)

dist[0]=0;//訪問過的頂點,到這棵樹的距離為0

vcount++;

parent[0]=-1;//等於-1的是樹根

//用鄰接表來承接樹的資訊

//建立乙個有頂點但是沒有邊的鄰接表

mst=creategraph_adjacencylist(graph->nv);

e=(edge)malloc(sizeof(struct enode));

//一直遍歷完所有的結點

while(1)}}

}if(vcountnv)

printf("最小樹的權值和%d\n",totalweight);

return mst;

}//尋找最小的權值點

vertex findmindist_matric(mgraph graph,weighttype dist)

二、kruskal演算法1、適用情景:邊稀疏的情況

區別prim:prim收集的是頂點,kruskal收集的是邊

2、偽**

viod kruskal()

if(沒有v-1條邊)

error("不存在生成樹");

}

3、**

Prim演算法 Kruskal演算法

prim演算法 kruskal演算法 prim演算法和kruskal演算法,都是用來找出圖中最小生成樹的演算法,兩個演算法有些小差別。prim演算法 又稱普里姆演算法,以圖上的頂點為出發點,逐次選擇到最小生成樹頂點集距離最短的頂點為最小生成樹的頂點,並加入到該頂點集,直到包含所有的頂點。1.選擇一出...

Kruskal演算法 Prim演算法

最小生成樹是什麼?自a2392008643的部落格 此演算法可以稱為 加邊法 初始最小生成樹邊數為0,每迭代一次就選擇一條滿足條件的最小代價邊,加入到最小生成樹的邊集合裡。把圖中的所有邊按代價從小到大排序 把圖中的n個頂點看成獨立的n棵樹組成的森林 按權值從小到 擇邊,所選的邊連線的兩個頂點ui,v...

Prim演算法和Kruskal演算法

一 prim演算法 prim演算法實現的是找出乙個有權重連通圖中的最小生成樹,即 具有最小權重且連線到所有結點的樹。強調的是樹,樹是沒有迴路的 prim演算法是這樣來做的 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產...