1. 程式人生 > >最小生成樹題集

最小生成樹題集

A題,L題:poj2421 簡單題
題意:題目這麼長,其實大部分都在扯逼-_-。以字母代替點,每行輸入字母,與其相連的個數,以及相連的具體點和其距離,計算全聯通最小距離。
題解:只需要把字母距離化為可用的每兩點距離,或鄰接矩陣即可。注意:並查集初始化別和輸入一起了,因為輸入只有n-1次,我就少初始化了wa了一次。不知道在L題能A的情況下A題runtime error了。。。

B題 poj1287 簡單題
題意:求最小生成樹,也就是遍及整個網路的最小距離。
題解:其實與K題基本相似,水題,無話可講。

C題 poj2031 簡單題
題意:給出n個球體的球心座標和半徑,可以在兩個球體的表面連一條通路,代價為距離. 求使得所有球體聯通的最小花費.
題解:注意兩點之間的距離為 (球心距 - 半徑和); 若這個式子小於0,則距離為0.
我G++交wa了,c++交過了…

D題:poj2421 簡單題
題意:有N個城市,讓城市全聯通的最小距離,但是有已經建好的道路。
題解:這樣將建好的道路路徑改為0,計算最短路肯定會算上這一條。

E題:poj1789 中等題
題意較難。。。作為渣渣看了好久。
題意:用一個字串代表一個編號,這兩個編號之間不同字母的個數代表兩個編號之間的距離,Q為連線所有點的最短距離。求1/Q。
題解:預處理下距離,化為可用的每兩點距離,或鄰接矩陣即可。

F 題:poj2349 中等題
題意:有S顆衛星和P個哨所,有衛星的兩個哨所之間可以任意通訊;一個哨所只能和距離它小於等於D的哨所通訊。給出衛星的數量和P個哨所的座標,求D的最小值。
題解:既然兩個有衛星的哨所可以任意通訊,那麼我們可以把最大的幾條邊作為任意通訊邊,可以減小D的大小,也就求最小生成樹的第s大的邊長。我們只需記入邊長,排序輸出即可。

G題:poj1751 簡單題
題意:給出點座標。
題解:跟D題類似,但是需要舉出具體最小生成樹邊,用pre記錄下即可。

H題:poj1258 簡單題
題意:農民需要所有農村的聯通更加快速,為了花費最小,他們想要連一條需要最小光纖長度的路徑。兩個農村距離不超過100000。
題解:已經給出鄰接矩陣圖,我們只需要用prim直接解決,或者用一個邊陣列儲存所有邊,用kruskal解決。

I題:poj3026 較難題
題意:給你一個圖,搜尋的開始時,該組可能會分裂在兩個或更多組,問整個組尋找玩所有Alice要多少步數。
題解:如果直接用DFS算,中間未分開的步數重複計算。需要用BFS先計算A與S到空點的距離,然後用最小生成樹解決,挺難寫,我還沒過呢,思路是對的。

J題:poj1679 較難題
題意:最小生成樹是否唯一。
題解:我想在尋找最小邊和鬆弛操作的時候比較是否相等,若有相等說明不止一條吧,但我想如果其第一條邊不同,但下面相加的總和相等是否會有可能,先按這思路先寫下。

K題:hdu1233 簡單題
題意:列出了任意兩村莊間的距離,目標是使任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。
題解:已經給出了各個邊的權值,直接用kruskal解決,或化成鄰接矩陣用prim解決。

M題:hdu1875 中等題
題意:要求在多個島之間建橋,並實現全暢通。但是有限制橋的長度是10<=x<=1000,橋價格為100元/米。給你小島座標,若無法全暢通輸出“oh!”,否則輸出最小花費。
題解:先預處理各點距離,存入陣列用kruskal做,或化鄰接矩陣用prim做,但是這裡衍生出另一個問題,如何判斷無法全暢通,我想只需要記錄連線的點的個數,沒辦法連完n個的即無法全暢通。注意:橋長限制,和浮點化。這裡橋長限制最好在預處理的時候就考慮好,
我在第一次做時候,放裡面判斷,應該會導致dis陣列出錯。