P1991 无线通讯网 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
分析:
- 和最小生成树的模板题差不多
- 需要注意的是模板题的截止条件是p-1,而这题是p-s;并且结果也不是累加的,而是刚好截止时的那个距离
代码:
#include <stdio.h>
#include <math.h>
int s,p,a[501],su=0;
double ans;
struct nb
{
int m,n;
double z;
}g[5000001];
struct nb c;
void quicksort(int l,int r)
{
int i,j;
if(l>r)
return;
i=l;
j=r;
while(i!=j)
{
while(g[j].z>=g[l].z&&i<j)
j--;
while(g[i].z<=g[l].z&&i<j)
i++;
if(i<j)
{
c=g[i];
g[i]=g[j];
g[j]=c;
}
}
c=g[l];
g[l]=g[i];
g[i]=c;
quicksort(l,i-1);
quicksort(i+1,r);
return;
}
int geta(int b)
{
if(a[b]==b)
return b;
else
{
a[b]=geta(a[b]);
return a[b];
}
}
double d(int a,int b,int c,int d)
{
return sqrt((b-a)*(b-a)+(d-c)*(d-c));
}
int main()
{
scanf("%d%d",&s,&p);
for(int i=1;i<=p;i++)
a[i]=i;
int x[5001],y[5001],t=1;
for(int i=1;i<=p;i++)
{
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1;i<p;i++)
for(int j=i+1;j<=p;j++)
{
g[t].m=i;
g[t].n=j;
g[t].z=d(x[i],x[j],y[i],y[j]);
t++;
}
quicksort(1,t-1);
for(int i=1;i<t;i++)
{
if(geta(g[i].m)!=geta(g[i].n))
{
su++;
ans=g[i].z;
a[geta(g[i].m)]=geta(g[i].n);
}
if(su==p-s)
break;
}
printf("%.2lf\n",ans);
return 0;
}