POJ2349(kruskal演算法建立最小生成樹)

2021-08-23 14:30:12 字數 1063 閱讀 4319

題意:在要求將所有無線**點都連線起來的基礎上輸出d的最小值。d是任意無線**點使用無線收發電機直接對外聯絡距離的最大值。無線**點連線有兩種方式:使用無線收發電機和衛星通道連線。給定資料是哨站的數量 ,衛星通道的數量,哨站的座標。求解d的最小值。

思路:(1)首先考慮沒有衛星通道時我們如何求解d的最小值。

回顧kruskal演算法的求解過程發現,這道題用kruskal演算法解決再好不過了。因為kruskal就是將結點之間邊的權值按照從小到大排序後再進行非連通圖合併成連通圖這個操作的。

所以:題目的解決就顯而易見:用kruskal求最小生成樹,將合併過的邊標記,標記表示這條邊在最小生成樹中。然後遍歷標記過的邊求出權值最大的那條邊即可。

此時,d的最小值就是最小生成樹上的最大邊權

(2)現在有了衛星通道,我們再考慮d的最小值。

這時我們的思路就可以轉移到減小最小生成樹的最大邊權了。

首先聯絡衛星通道的作用:在不考慮兩個站點座標的情況下將它們連線,這就是衛星通道的作用。但是前提條件是連線的兩個站點必須都要安裝衛星通道(這個隱含條件必須看出來)。那麼我們就考慮「減邊」操作。

那麼我們為了使通道利用最大化,將乙個衛星通道放到最後去掉的邊的端點上。然後從大到小的減少最小生成樹上的最大邊權。

減邊操作的截止條件是通道使用完成。

然後遍歷最小生成樹,此時求出的「減去邊後」的最大邊權就是d的最小值。

**:

#include#include#include#include#includeusing namespace std;

const int maxn=505;

int n,s,qq;//s是衛星基站的數量

double ans;

int pre[maxn];

struct post

pp[maxn*(maxn>>1)];

double x[maxn];

double y[maxn];

void init()

for(int i=0; iif(pp[i].unions)

}int main()

return 0;

}

poj 2349 Kruskal 最小生成樹

題目大意 題目分析 實現 c include include include includeusing namespace std define max node 505 點的資料結構 struct point vectorgpoints 邊的資料結構 struct edge vectorgedge...

poj 2349解題報告

想比賽前吧模板整理好,就做了一道這個題看看模板 題意 有p個點,用座標給出,有兩種 1每個點可以和距離在d以內的點相互聯絡,2有s個專門的衛星通道,兩個點直接聯絡 求d最小多少可以把這個圖連起來 題解 首先不考慮s個衛星通道,先求最小生成樹,用衛星通道把最小生成樹中最大的s 1個邊代替掉,然後剩下的...

poj 2349解題報告

想比賽前吧模板整理好,就做了一道這個題看看模板 題意 有p個點,用座標給出,有兩種 1每個點可以和距離在d以內的點相互聯絡,2有s個專門的衛星通道,兩個點直接聯絡 求d最小多少可以把這個圖連起來 題解 首先不考慮s個衛星通道,先求最小生成樹,用衛星通道把最小生成樹中最大的s 1個邊代替掉,然後剩下的...