Poj2349 Arctic Network (北极通讯网络)
北极的某区域共有 n 座村庄,每座村庄的坐标用一对整数 (x,y) 表示。为了加强联系,决定在村庄之间建立通讯网络。通讯工具可以是无线电收发机,也可以是卫星设备。所有的村庄都可以拥有一部无线电收发机, 且所有的无线电收发机型号相同。但卫星设备数量有限,只能给一部分村庄配备卫星设备。
不同型号的无线电收发机有一个不同的参数 d,两座村庄之间的距离如果不超过 d 就可以用该型号的无线电收发机直接通讯,d 值越大的型号价格越贵。拥有卫星设备的两座村庄无论相距多远都可以直接通讯。
现在有 k 台卫星设备,请你编一个程序,计算出应该如何分配这 k 台卫星设备,才能使所拥有的无线电收发机的 d 值最小,并保证每两座村庄之间都可以直接或间接地通讯。
例如,对于下面三座村庄:
其中 |AB|=10,|BC|=20,|AC|=10√5≈22.36
如果没有任何卫星设备或只有 1 台卫星设备 (k=0 或 k=1),则满足条件的最小的 d=20,因为 A 和 B,B 和 C 可以用无线电直接通讯;而 A 和 C 可以用 B 中转实现间接通讯 (即消息从 A 传到 B,再从 B 传到 C);
如果有 2 台卫星设备 (k=2),则可以把这两台设备分别分配给 B 和 C ,这样最小的 d 可取 10,因为 A 和 B 之间可以用无线电直接通讯;B 和 C 之间可以用卫星直接通讯;A 和 C 可以用 B 中转实现间接通讯。
如果有 3 台卫星设备,则 A,B,C 两两之间都可以直接用卫星通讯,最小的 d 可取 0。
已经是一年前做的题了,今天又遇到,算是缘分吧
曾今的代码风格还稍显稚嫩,还不会写read和write,变量名字也起的是同学名字的首字母,有一些已经退役了
首先是两两连边,然后直接最小生成树
下面给出代码:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std; inline long long rd(){ long long x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } int x[10000],y[10000],f[100000]; double road[100000]; struct node{ int a,b,c; double wht; }map[1000000]; void whtsort(int l,int r){ int i,j; node t; if(l>r) return ; i=l; j=r; while(i!=j){ while(map[j].wht>=map[l].wht&&i<j) j--; while(map[i].wht<=map[l].wht&&i<j) i++; if(i<j){ t=map[i]; map[i]=map[j]; map[j]=t; } } t=map[l]; map[l]=map[i]; map[i]=t; whtsort(l,i-1); whtsort(i+1,r); return ; } double hhd(double a1,double b1,double a2,double b2){ double aa=a1-a2,bb=b1-b2; double hh=sqrt((aa*aa)+(bb*bb)); return hh; } int getf(int hh){ if(f[hh]==hh) return hh; else return f[hh]=getf(f[hh]); } int merge(int xx,int yy){ int t1,t2; t1=getf(xx); t2=getf(yy); if(t1!=t2){ f[t2]=t1; return 1; } return 0; } int main(){ int n=0,m=0,i=0,j=0,k=1,count=0; m=rd(),n=rd(); for(i=1;i<=m;i++){ x[i]=rd(),y[i]=rd(); for(j=1;j<i;j++){ map[k].wht=hhd(x[i],y[i],x[j],y[j]); map[k].a=i; map[k].b=j; k++; } } whtsort(1,k); for(i=1;i<=m;i++)f[i]=i; for(i=1;i<=k;i++){ if(merge(map[i].a,map[i].b)==1){ road[count]=map[i].wht; count++; } } printf("%.2f\n",road[count-n]); return 0; }
蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿