1.prim演算法求解,其思路與dijkstra差不多,不斷貪心往已選定的集合眾新增點,最終得到一棵最小生成樹。具體為什麼最**不清==,
1view codeint map[105][105];2
int mincost[105];3
int vis[105];4
void
prim()518
if(v==-1) break
;19 vis[v]=1
;20 res+=mincost[v];
21for(u=1;u<=n;u++)
22 mincost[u]=min(map[v][u],mincost[u]);23}
24return
;25 }
2.kruskal演算法求解,首先對所給的邊按照權值大小進行排序,然後從小到大放入到集合中,能否放進去的條件是放入後不會產生圈。此時使用並查集來判斷是否產生圈。也就是判斷放入的這條邊的兩端段是否在同乙個集合當中。
白書裡給的並查集模板:
1view codeint par[max]; //
記錄父節點,根節點的父節點為本身
2int rank0[max]; //
記錄樹的高度,用於集合的合併
3void
init()410
11}12int find(int
x)13
19void unite(int x,int
y)2034}
35bool same(int x,int
y)36
kruskal:
1view codestruct
edge
2es[10000];5
inte;
6int
kruskal()719
}20return
sum;
21 }
prim演算法求解最小生成樹
首先滿足樹的條件,各邊權值加起來是最小的,同乙個圖的最小生成樹可能是不同的但是權值之和是一樣的 prim 假設有乙個圖,裡面的頂點可以分為,已近加入樹的和未加入樹的 從第乙個頂點開始,尋找權值最小的邊,然後把這個邊相連的頂點加入,已經在樹的集合內 在這兩個集合相連的節點上尋找權值最小的邊加入和 上 ...
最小生成樹 次小生成樹
一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...
最小生成樹
package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...