最小スパニングツリーの拡張アプリケーション-------- Arctic Communication Network

北極の地域には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;
}
公開された元の記事164件 いいね112 訪問者6774

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/105441778