最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹。
最小生成樹是圖論演算法中比較經典的問題,在現實生活中也有非常多的應用。有兩種比較經典的演算法,都是使用了貪心的思想解決:
prim
class
solution
/** * 圖論中的最小生成樹prim演算法
* @param points
* @return
*/public
intprim
(int
points)
else}}
// v_new 表示圖中節點的訪問情況,最開始全部為-1,表示未加入到v_new中,若某節點加入到了v_new中, 則將其置為0
int[
] v_new =
newint
[len]
;// lowcost 儲存每個節點離v_new中所有節點的最短距離。初始化為integer.max_value,如果節點已經加入到了v_new中,則置為-1
int[
] lowcost =
newint
[len]
;for
(int i =
0; i < len; i++
)//2.隨機選取乙個節點,預設為第乙個節點,並且更新lowcost裡面的值
v_new[0]
=0;for
(int i =
0; i < len; i++
)else
}//3. 遍歷未放入v_new 的剩餘的節點,
for(
int i =
1; i < len; i++)}
//更新 v_new 裡面的值
res += minval;
v_new[minidx]=0
; lowcost[minidx]
= integer.max_value;
//更新 lowcost 裡面的值
for(
int j =
0; j < len; j++)}
}return res;
}private
intcomputeconst
(int x1,
int y1,
int x2,
int y2)
}
kruskal
class
solution
} collections.
sort
(edges,
(a, b)
->
( a.len - b.len
));int ans =
0, edgenum =0;
dsu dsu =
newdsu
(points.length)
;for
(edge edge : edges)
if(edgenum == points.length -1)
break;}
return ans;
}public
intgetlength
(int
points,
int point1,
int point2)
private
class
edge
}private
class
dsu}
public
intfind
(int x)
return parents[x];}
public
boolean
union
(int x,
int y)
else
if(rank[xr]
< rank[yr]
)else
return
true;}
}}
leetcode1584-連線所有點的最小費用 最小生成樹問題
1.構造可以使n個城市連線的最小生成樹。問題描述 給定乙個地區的n個城市間的距離網,用prim演算法或kruskal演算法建立最小生成樹,並計算得到的最小生成樹的代價。4 要求 1 城市間的距離網採用鄰接矩陣表示,鄰接矩陣的儲存結構定義採用課本中給出的定義,若兩個城市之間不存在道路,則將相應邊的權值...
最小生成樹問題
最小生成樹 是一棵樹 無迴路 個頂點一定有 條邊 包含全部頂點 條邊都在圖里 邊的權重和最小 生成約束 只能用圖里有的邊 只能正好用掉 條邊 不能有迴路 主要演算法 prim演算法 讓樹長大 int prim int n int ans 0 距離權值總和 vis 1 true 生成樹的根 起點 標記...
最小生成樹問題
最小生成樹 乙個有n個點的圖,邊一定是大於等於n 1條的。圖的最小生成樹,就是在這些邊中選擇n 1條出來,連線所有的n個點。這n 1條邊的邊權之和是所有方案中最小的。最小生成樹用來解決什麼問題?就是用來解決如何用最小的 代價 用n 1條邊連線n個點的問題。例題 洛谷p3366 乾坤大挪移 最小生成樹...