羅区-1991無線通信ネットワーク

タイトル説明
防衛省は、ワイヤレスネットワークにいくつかのボーダーポストを接続することを計画しています。二つの異なる技術は、無線通信ネットワークを構築するために使用され、
各ボーダーポストは、無線トランシーバを装備しなければならない;いくつかの記事はまた、衛星電話が増加してもよいです。
任意の二つの衛星電話回線の記事(両側ᤕ衛星電話)を装備したコールは関係なく、彼らがどのように離れて、になることはできません。唯一の無線トランシーバポストを介して呼の間の距離は、トランシーバの電力によって制限されるDを超えることはできません。トランシーバの電源、通話距離D遠く高いが、価格はより高価になるだろう。
トランシーバは、統一購入し、インストールする必要があり、そのすべての記事は、トランシーバの1種類をインストールすることができます。換言すれば、コールの各対の間の距離が同じポストD.であります あなたの仕事は最小呼出トランシーバは、(直接または間接的に)少なくとも呼経路そのポストの各対の間、Dを遠ざける必要があります決定することです。
入力出力形式の
入力フォーマット:
からwireless.in入力データ線1,2及び整数S P、Sは、支柱の数は衛星電話を装着してもよい表し、Pは、境界ポストの数を表します。二つの整数xのP線を引き継いだ、y平面はキロで、(x、y)のポストを記述する座標。
出力形式:
wireless.out出力
最初の行、実数Dは、小数点以下の精度無線トランシーバの最小伝送距離を表します。

サンプル入力出力
入力サンプル#1:
2 4
0 100
0 300
0 600
150 750

出力サンプル#1:
212.13

記述
データの20%のために:P = 2、S = 1つ
の他の20%のためのデータ:P = 4、S = 2
のデータの100%のことを確実にするために:1≤S≤100、S <P≤500,0≤Xを、yは10000を≤します。

説明:最初は、各点を列挙し、側との距離を計算し、その後、小から大までそれを注文。私たちエッジに二分答え、互いに素セットの良好な関係ユニコム、各グループ衛星電話への1-半ばの貢献、ミッド+ 1を維持するための利点を生かしつつ - 衛星電話にトン各点の貢献。最後に、あなたはSと半分を比較することができます

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define N 505
using namespace std;
struct node{
    double x,y;
};
node s[N];
int father[N*N]={0};
int H[N*N]={0};
int n=0,m=0;
struct edge{
    int a,b;
    double c;
};
edge E[N*N];
int t=0;
void init(){
    for(int i=0;i<N*N;i++) father[i]=i,H[i]=0;
}
int find(int x){
    if(father[x]==x) return x;
    return father[x]=find(father[x]);
}
void merge(int x,int y){
    x=find(x);y=find(y);
    father[x]=y;
}
bool cmp(edge &a,edge &b){
    return a.c<b.c;
}
bool same(int x,int y){
    return find(x)==find(y);
}
bool ok(int x){
    init();
    int ret=0;
    for(int i=1;i<=x;i++){
        if(!same(E[i].a,E[i].b)){
            H[E[i].a]=H[E[i].b]=1;
            merge(E[i].a,E[i].b);
        }
    }
    for(int i=1;i<=n;i++){
        if(!H[i]) ret++;
        if(find(i)!=i&&H[find(i)]==1) ret++;
        H[find(i)]=2;
    }
    return ret<=m;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>m>>n;
    for(int i=1;i<=n;i++) cin>>s[i].x>>s[i].y;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            E[++t].a=i,E[t].b=j;
            E[t].c=(s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y);
        }
    }
    sort(E+1,E+1+t,cmp);
    int l=0,r=t;
    int mid=0;
    while(l<r){
        mid=(l+r)/2;
        if(ok(mid)) r=mid;
        else l=mid+1;
    }
    printf("%.2f\n",sqrt(E[l].c));
    return 0;
}

おすすめ

転載: blog.csdn.net/mkopvec/article/details/92617243