acwing 1145. 北極通訊網路
北極的某區域共有 n 座村莊,每座村莊的座標用一對整數 (x,y) 表示。
通訊工具可以是無線電收發機,也可以是衛星裝置。
無線電收發機有多種不同型號,不同型號的無線電收發機有乙個不同的引數 d,兩座村莊之間的距離如果不超過 d,就可以用該型號的無線電收發機直接通訊,d 值越大的型號**越貴。現在要先選擇某一種型號的無線電收發機,然後t統一給所有村莊配備,數量不限,但型號都是 相同的。
配備衛星裝置的兩座村莊無論相距多遠都可以直接通訊,但衛星裝置是 有限的,只能給一部分村莊配備。
現在有 k 臺衛星裝置,請你編乙個程式,計算出應該如何分配這 k 臺衛星裝置,才能使所配備的無線電收發機的 d 值最小。
例如,對於下面三座村莊:
其中,|ab|=10,|bc|=20,|ac|=10√5≈22.36。
如果沒有任何衛星裝置或只有 1 臺衛星裝置 (k=0 或 k=1),則滿足條件的最小的 d=20,因為 a 和 b,b 和 c 可以用無線電直接通訊;而 a 和 c 可以用 b 中轉實現間接通訊 (即訊息從 a 傳到 b,再從 b 傳到 c);
如果有 2 臺衛星裝置 (k=2),則可以把這兩台裝置分別分配給 b 和 c ,這樣最小的 d 可取 10,因為 a 和 b 之間可以用無線電直接通訊;b 和 c 之間可以用衛星直接通訊;a 和 c 可以用 b 中轉實現間接通訊。
如果有 3 臺衛星裝置,則 a,b,c 兩兩之間都可以直接用衛星通訊,最小的 d 可取 0。
輸入格式
第一行為由空格隔開的兩個整數 n,k;
接下來 n 行,每行兩個整數,第 i 行的 xi,yi 表示第 i 座村莊的座標 (xi,yi)。
輸出格式
乙個實數,表示最小的 d 值,結果保留 2 位小數。
資料範圍
1≤n≤500,
0≤x,y≤104,
0≤k≤100
輸入樣例:
3 210 10
10 0
30 0
輸出樣例:
10.00
先跑一遍最小生成樹,然後再刪除前k大的邊,再輸出最大的那條邊。
#include
using
namespace std;
const
int maxn=
1e6;
int n,k;
int x[maxn]
,y[maxn]
;int fa[maxn]
;struct node
}e[maxn*2]
;void
init()
return;}
doublejl(
int a,
int b)
intfind
(int x)
return fa[x];}
intmain()
int idx=1;
for(
int i=
1;i<=n;i++)}
sort
(e+1
,e+idx+1)
;init()
;double res=0;
int cnt=0;
for(
int i=
1;i<=idx;i++)if
(cnt==n-k)
}printf
("%.2lf\n"
,res)
;return0;
}
1145 北極通訊網路
解題報告 這道題實質上是在問滿足存在k個連通塊的最小d是多少。然而並不用二分,因為在kruskal演算法的過程中本身聯通塊的數目就是遞減的,從一開始的n到k然後記錄最小值就能ac這道題了。include include include include using namespace std cons...
北極通訊網路
北極的某區域共有 nn 座村莊,每座村莊的座標用一對整數 x,y x,y 表示。通訊工具可以是無線電收發機,也可以是衛星裝置。無線電收發機有多種不同型號,不同型號的無線電收發機有乙個不同的引數 dd,兩座村莊之間的距離如果不超過 dd,就可以用該型號的無線電收發機直接通訊,dd 值越大的型號 越貴。...
Kruskal 北極通訊網路
不同型號的無線電收發機有乙個不同的引數d,兩座村莊之間的距離如果不超過d就可以用該型號的無線電收發機直接通訊,d值越大的型號 越貴。擁有衛星裝置的兩座村莊無論相距多遠都可以直接通訊。現在有k臺 1 k 100 衛星裝置,請你編寫乙個程式,計算出應該如何分配這k臺衛星裝置,才能使所有的無線電收發機的d...