天天看點

【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)

以(x,y)坐标的形式給出n個點,修建若幹條路使得所有點連通(其中有兩個給出的特殊點必須相鄰),求所有路的總長度的最小值。

因對所修的路的形狀沒有限制,是以可看成帶權無向完全圖,邊權值為兩點間距離。因是稠密圖,故用鄰接矩陣存儲更好(完全圖,邊數e達到n(n-1)/2)。

至此,可将問題抽象為求最小生成樹的邊權和。

用了prim+鄰接矩陣,prim+鄰接表+堆,kruscal各寫了一遍,隻是記憶體稍有差别

【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)

對于所給的特殊的兩個相鄰點,隻需在開始循環前把這兩個點加入子樹集合并更新它們所到達的點的mincost即可。

【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)
【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)

prim_鄰接矩陣

【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)
【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)

prim_鄰接表_堆

【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)
【HDU 4463 Outlets】最小生成樹(prim,kruscal都可)

kruscal_邊數組

鄰接矩陣版Prim算法求最小生成樹,時間複雜度為O(n*n)。鄰接表版prim用堆優化後理論上可達O(elogn),邊數組版kruscal理論也為O(elogn),但此題是完全圖,e=n(n-1)/2,故實為O(n*nlogn)>O(n*n)。--這段分析有待考證。。。

繼續閱讀