最小生成樹問題

2021-10-22 18:43:20 字數 2068 閱讀 4180

最小生成樹是一副連通加權無向圖中一棵權值最小的生成樹。

最小生成樹是圖論演算法中比較經典的問題,在現實生活中也有非常多的應用。有兩種比較經典的演算法,都是使用了貪心的思想解決:

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 乾坤大挪移 最小生成樹...