洛谷 P1991 無線通訊網
阿新 • • 發佈:2018-05-20
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 usingnamespace 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 無線通訊網