北極的某區域共有 nn 座村莊,每座村莊的座標用一對整數 (x,y)(x,y) 表示。
通訊工具可以是無線電收發機,也可以是衛星裝置。
無線電收發機有多種不同型號,不同型號的無線電收發機有乙個不同的引數 dd,兩座村莊之間的距離如果不超過 dd,就可以用該型號的無線電收發機直接通訊,dd 值越大的型號**越貴。現在要先選擇某一種型號的無線電收發機,然後t統一給所有村莊配備,數量不限,但型號都是 相同的。
配備衛星裝置的兩座村莊無論相距多遠都可以直接通訊,但衛星裝置是 有限的,只能給一部分村莊配備。
現在有 kk 臺衛星裝置,請你編乙個程式,計算出應該如何分配這 kk 臺衛星裝置,才能使所配備的無線電收發機的 dd 值最小。
例如,對於下面三座村莊:
1.png
其中,|ab|=10,|bc|=20,|ac|=105√≈22.36|ab|=10,|bc|=20,|ac|=105≈22.36。
如果沒有任何衛星裝置或只有 11 臺衛星裝置 (k=0k=0 或 k=1k=1),則滿足條件的最小的 d=20d=20,因為 aa 和 bb,bb 和 cc 可以用無線電直接通訊;而 aa 和 cc 可以用 bb 中轉實現間接通訊 (即訊息從 aa 傳到 bb,再從 bb 傳到 cc);
如果有 22 臺衛星裝置 (k=2k=2),則可以把這兩台裝置分別分配給 bb 和 cc ,這樣最小的 dd 可取 1010,因為 aa 和 bb 之間可以用無線電直接通訊;bb 和 cc 之間可以用衛星直接通訊;aa 和 cc 可以用 bb 中轉實現間接通訊。
如果有 33 臺衛星裝置,則 a,b,ca,b,c 兩兩之間都可以直接用衛星通訊,最小的 dd 可取 00。
輸入格式
第一行為由空格隔開的兩個整數 n,kn,k;
接下來 nn 行,每行兩個整數,第 ii 行的 xi,yixi,yi 表示第 ii 座村莊的座標 (xi,yixi,yi)。
輸出格式
乙個實數,表示最小的 dd 值,結果保留 22 位小數。
資料範圍
1≤n≤5001≤n≤500,
0≤x,y≤1040≤x,y≤104,
0≤k≤1000≤k≤100
輸入樣例:
3 210 10
10 0
30 0
輸出樣例:
10.00
分析:
一看到聯通塊,我們可以快速的想到克魯斯卡爾演算法.
回憶克魯斯卡爾演算法的過程:
1.將邊權從小到大排序.
2.依次從小到大掃瞄每一條邊,合併沒有合併的點集.
我們發現第二步本質上就是在維護聯通快的個數.
由此我們就得到了這道題的解決方法:
正常執行克魯斯卡爾演算法,記錄當前已經加入了幾條邊.
當加入某條邊後,恰好加入了n-k條邊.
那麼這條邊的權值就是最終答案.
#include
using
namespace std;
const
int n =
510, m = n*n/2;
int n,m,k;
struct edge
}e[m]
;int p[n]
;double a[n]
,b[n]
;double
count
(double x1,
double y1,
double x2,
double y2)
intfind
(int x)
intmain()
for(
int i =
1; i <= n; i ++);
}}sort
(e, e + m)
;int cnt = n;
double res;
for(
int i =
0; i < m; i ++)}
printf
("%.2f"
,res)
;return0;
}
Kruskal 北極通訊網路
不同型號的無線電收發機有乙個不同的引數d,兩座村莊之間的距離如果不超過d就可以用該型號的無線電收發機直接通訊,d值越大的型號 越貴。擁有衛星裝置的兩座村莊無論相距多遠都可以直接通訊。現在有k臺 1 k 100 衛星裝置,請你編寫乙個程式,計算出應該如何分配這k臺衛星裝置,才能使所有的無線電收發機的d...
1145 北極通訊網路
解題報告 這道題實質上是在問滿足存在k個連通塊的最小d是多少。然而並不用二分,因為在kruskal演算法的過程中本身聯通塊的數目就是遞減的,從一開始的n到k然後記錄最小值就能ac這道題了。include include include include using namespace std cons...
最小生成樹 北極通訊網路
時間限制 1 sec 記憶體限制 128 mb 提交 17 解決 7 提交 狀態 討論版 命題人 add xiezhenghao 不同型號的無線電收發機有乙個不同的引數d,兩座村莊之間的距離如果不超過d就可以用該型號的無線電收發機直接通訊,d值越大的型號 越貴。擁有衛星裝置的兩座村莊無論相距多遠都可...