【洛谷P1991】无线通讯网
无线通讯网
先克鲁斯卡尔连上p-s条边,这样就会有s个连通块,每个连通块内装一个卫星电话,就大功告成了
#include<algorithm> #include<cstdio> #include<cmath> #include<iostream> using namespace std; #define N 510 int s,p,cnt,fa[N],tot; double x[N],y[N],ans; inline double Dis(int a,int b){ return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])); } struct Edge{ int s,t; double w; } e[N*N]; inline bool cmp(Edge a,Edge b){ return a.w<b.w; } inline int find(int x){ return fa[x]==x?x:fa[x]=find(fa[x]); } inline void unionn(int x,int y){ fa[find(x)]=find(y); } int main() { scanf("%d%d",&s,&p); for(int i=1;i<=p;i++) scanf("%lf%lf",&x[i],&y[i]); for(int i=1;i<=p;i++) fa[i]=i; for(int i=1;i<p;i++) for(int j=i+1;j<=p;j++) if(i!=j){ e[++cnt].s=i; e[cnt].t=j; e[cnt].w=Dis(i,j); } sort(e+1,e+1+cnt,cmp); for(int i=1;i<=cnt;i++) if(find(e[i].s)!=find(e[i].t)){ unionn(e[i].s,e[i].t); tot++; if(tot==p-s){ ans=e[i].w; break; } } printf("%.2lf\n",ans); return 0; }