「NOIP模拟赛」无线通讯网
「题目描述」
国防部计划用无线网络连接若干个边防哨所。2种不同的通讯技术用来搭建无线网络;每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。
任意两个配备了一条卫星电话线路的哨所(两边都拥有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过D,这是受收发器的功率限制。收发器的功率越高,通话距离D会更远,但同时价格也会更贵。
收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个D。
你的任务是确定收发器必须的最小通话距离D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。
「输入格式」 wireless.in
第1行:2个整数S(1<=S<=100)和P(S<P<=500),S表示可安装的卫星电话的哨所数,P表示边防哨所的数量。
接下里P行,每行描述一个哨所的平面坐标(x,y),以km为单位,整数,0<=x,y<=10000。
「输出格式」 wireless.out
第1行:1个实数D,表示无线电收发器的最小传输距离。精确到小数点后两位。
「样例输入」
2 4
0 100
0 300
0 600
150 750
「样例输出」
212.13
数据范围
对于20%的数据 P=2,S=1
对于另外20%的数据 P=4,S=2
对于100%的数据 1<=S<=100,S<P<=500
题解
最小生成树。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<cmath> #define inf 0x7fffffff #define ll long long using namespace std; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int s,n,tot,cnt; int x[505],y[505],fa[505]; struct data{int x,y;double v;}e[200005]; inline int sqr(int x){return x*x;} inline double dis(int a,int b) {return sqrt(sqr(x[a]-x[b])+sqr(y[a]-y[b]));} inline bool operator<(data a,data b) {return a.v<b.v;} int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} void insert(int u,int v,double w) {e[++cnt].x=u;e[cnt].y=v;e[cnt].v=w;} int main() { //freopen("wireless.in","r",stdin); //freopen("wireless.out","w",stdout); s=read();n=read(); for(int i=1;i<=n;i++) x[i]=read(),y[i]=read(); for(int i=1;i<=n;i++)fa[i]=i; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) insert(i,j,dis(i,j)); sort(e+1,e+cnt+1); int i; for(i=1;i<=cnt;i++) { int p=find(e[i].x),q=find(e[i].y); if(p!=q){fa[p]=q;tot++;} if(tot+s>=n)break; } printf("%.2lf",e[i].v); return 0; } |
Subscribe