这题是要你求讲所有点连起来的最小的代价是多少。连起两点的代价是两个点之间的距离。。。最基本的最小生成树
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200;
int u[maxn*maxn],v[maxn*maxn];
double dis[maxn*maxn];
double x[maxn*maxn],y[maxn*maxn];
int p[maxn*maxn];
int r[maxn*maxn];
int n;
void init()
{
for(int i=1;i<=n;i++)
p[i]=i;
}
bool cmp(int i,int j)
{
return dis[i]<dis[j];
}
double disd(double a,double b,double c,double d)
{
return sqrt(pow(a-c,2.0)+pow(b-d,2.0));
}
int find(int x)
{
return p[x]==x?x:find(p[x]);
}
double kua(int n)
{
double ans=0;
init();
for(int i=0;i<n;i++)
r[i]=i;
sort(r,r+n,cmp);
for(int i=0;i<n;i++)
{
int w=r[i];
int x=find(u[w]);
int y=find(v[w]);
if(x!=y)
{
ans+=dis[w];
p[x]=y;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf %lf",&x[i],&y[i]);
int k=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double len=disd(x[i],y[i],x[j],y[j]);
dis[k]=len;
u[k]=i;
v[k]=j;
k++;
}
}
double ans=kua(k);
printf("%0.2lf
",ans);
if(t)
printf("
");
}
return 0;
}