一、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演算法是這樣來做的 首先以乙個結點作為最小生成樹的初始結點,然後以迭代的方式找出與最小生成樹中各結點權重最小邊,並加入到最小生成樹中。加入之後如果產...