北極の地域にはnnがあります
村、各村の座標は整数のペア(x、y)(x、y)を使用します
言った。接続を強化するために、2つの村ごとに直接または間接的に通信できるように、村間の通信ネットワークを確立することが決定されました。通信ツールは、無線トランシーバまたは衛星デバイスであり得る。無線トランシーバーには多くの異なるモデルがあり、無線トランシーバーの異なるモデルには異なるパラメーターddがあります。
、2つの村の間の距離がddを超えない場合
、このタイプの無線トランシーバと直接通信できます、dd
値が大きいほど、モデルが高価になります。ここで、まず特定のタイプの無線トランシーバーを選択し、次にすべての村に一定の数を装備する必要がありますが、数に制限はありませんが、モデルは同じです。衛星機器を備えた2つの村は、距離が離れていても直接通信できますが、衛星機器には制限があり、一部の村にしか装備できません。今すぐ
衛星デバイス、このkkを割り当てる方法を計算するプログラムを作成してください
装備された無線トランシーバーのddを作るための衛星機器
値が最小です。たとえば、次の3つの村の場合:where | 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
)、これら2つのデバイスを別々にBBに割り当てることができます
そしてCC
、つまり最小のdd
望ましい1010
AAだから
そしてBB
ラジオと直接通信できる; BB
そしてCC
衛星と直接通信できる; AA
そしてCC
BBが使える
トランジットは間接的なコミュニケーションを実現します。33がある場合
衛星機器、A、B、CA、B、C
衛星通信は2つの間で直接使用でき、最小のdd
望ましい00
。入力フォーマットの最初の行は、スペースで区切られた2つの整数n、kn、kです。
;次へ
ライン、ラインごとに2つの整数、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 2
10 10
10 0
30 0
出力例:10.00
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 510, M = N * N / 2;
#define x first
#define y second
typedef pair<int, int> PII;
int n, m, k;
struct Edge{
int a, b;
double w;
bool operator <(const Edge &t) const{
return w < t.w;
}
}e[M];
PII q[N];
int p[N];
double get_dist(PII a, PII b){
int dx = a.x - b.x;
int dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
cin >> n >> k;
for (int i = 0; i < n; i ++)
cin >> q[i].x >> q[i].second;
for (int i = 0; i < n; i ++)
for (int j = 0; j < i; j ++)
e[m ++] = {i, j, get_dist(q[i], q[j])};
for (int i = 0; i < n; i ++) p[i] = i;
sort(e, e + m);
double res = 0;
int cnt = n;
for (int i = 0; i < m; i ++){
if (cnt <= k) break;
int a = find(e[i].a), b = find(e[i].b);
double w = e[i].w;
if (a != b){
p[a] = b;
cnt --;
res = w;
}
}
printf("%.2lf\n", res);
return 0;
}