#include<stdio.h>
#include<stdlib.h>
double min[10001]={0};
long long x[10001]={0},y[10001]={0},vis[10001]={0};
double cal(int a,int b)
{
double t;
t=sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
return t;
}
int main()
{
double sum=0,min1=10000000,t;
int i,j,n,u;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%lld%lld",&x[i],&y[i]);
min[1]=0;
for(i=2;i<=n;i++)
min[i]=10000000;
for(i=1;i<=n;i++)
{
min1=10000000;
for(j=1;j<=n;j++)
if(vis[j]==0&&min[j]<min1)
{
min1=min[j];
u=j;
}
vis[u]=1;
sum+=min1;
for(j=1;j<=n;j++)
{
t=cal(u,j);
if(t<min[j])
min[j]=t;
}
}
printf("%.2f",sum);
return 0;
}
洛谷1265
#include<stdio.h>
#include<stdlib.h>
int x[1000001]={0},y[1000001]={0},x1[1000001]={0},y2[1000001]={0},father[1000001]={0},b[1000001]={0};
float dis[1000001]={0};
void swap(int a,int b)
{
float t;
int t1;
t=dis[a];dis[a]=dis[b];dis[b]=t;
t1=x1[a];x1[a]=x1[b];x1[b]=t1;
t1=y2[a];y2[a]=y2[b];y2[b]=t1;
return;
}
int quicksort(int left,int right)
{
int i,j;
float mid;
i=left;j=right;mid=dis[(i+j)/2];
while(i<=j)
{
while(dis[i]<mid) i++;
while(dis[j]>mid) j--;
if(i<=j)
{
swap(i,j);
i++;j--;
}
}
if(i<right) quicksort(i,right);
if(j>left) quicksort(left,j);
return 0;
}
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void unit(int r1,int r2)
{
father[r2]=r1;
return;
}
int main()
{
int s,p,i,j,k=0,r1,r2,ans=0,ans2=0;
float max=0;
scanf("%d%d",&s,&p);
for(i=1;i<=p;i++)
scanf("%d%d",&x[i],&y[i]);
for(i=1;i<=p;i++)
for(j=1;j<i;j++)
if(i!=j)
{
k++;
dis[k]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
x1[k]=i;
y2[k]=j;
}
quicksort(1,k);
for(i=1;i<=k;i++)
father[i]=i;
for(i=1;i<=k;i++)
{
r1=find(x1[i]);r2=find(y2[i]);
if(r1!=r2)
{
ans++;
max=dis[i];
unit(r1,r2);
}
if(ans>=p-s)
break;
}
printf("%.2f",max);
return 0;
}
kruskal 洛谷1991