1. 程式人生 > >洛谷 P1991 無線通訊網

洛谷 P1991 無線通訊網

int sticky 復制 單位 生成 無線網 continue pri scanf

P1991 無線通訊網

題目描述

國防部計劃用無線網絡連接若幹個邊防哨所。2 種不同的通訊技術用來搭建無線網絡;

每個邊防哨所都要配備無線電收發器;有一些哨所還可以增配衛星電話。

任意兩個配備了一條衛星電話線路的哨所(兩邊都?有衛星電話)均可以通話,無論

他們相距多遠。而只通過無線電收發器通話的哨所之間的距離不能超過 D,這是受收發器

的功率限制。收發器的功率越高,通話距離 D 會更遠,但同時價格也會更貴。

收發器需要統一購買和安裝,所以全部哨所只能選擇安裝一種型號的收發器。換句話

說,每一對哨所之間的通話距離都是同一個 D。你的任務是確定收發器必須的最小通話距

離 D,使得每一對哨所之間至少有一條通話路徑(直接的或者間接的)。

輸入輸出格式

輸入格式:

從 wireless.in 中輸入數據第 1 行,2 個整數 S 和 P,S 表示可安裝的衛星電話的哨所

數,P 表示邊防哨所的數量。接下裏 P 行,每行兩個整數 x,y 描述一個哨所的平面坐標

(x, y),以 km 為單位。

輸出格式:

輸出 wireless.out 中

第 1 行,1 個實數 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。

思路:最小生成樹的版子題。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 510
using
namespace std; int n,m,tot,num; double ans; int x[MAXN],y[MAXN],fa[MAXN]; struct nond{ int u,v;double dis; }v[MAXN*MAXN]; int cmp(nond a,nond b){ return a.dis<b.dis; } int find(int x){ return fa[x]==x?fa[x]:fa[x]=find(fa[x]); } int main(){ freopen("wireless.in","r",stdin); freopen("wireless.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]); for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++){ v[++tot].u=i;v[tot].v=j; v[tot].dis=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } sort(v+1,v+1+tot,cmp); for(int i=1;i<=m;i++) fa[i]=i; for(int i=1;i<=tot;i++){ int dx=find(v[i].u),dy=find(v[i].v); if(dx==dy) continue; fa[dy]=dx;num++; if(num==m-n) ans=v[i].dis; } printf("%.2lf",ans); }

洛谷 P1991 無線通訊網