记录编号 |
342915 |
评测结果 |
AAAAAAAAAA |
题目名称 |
线型网络 |
最终得分 |
100 |
用户昵称 |
Zwoi_只会打表抄代码的蒟蒻 |
是否通过 |
通过 |
代码语言 |
C |
运行时间 |
0.090 s |
提交时间 |
2016-11-08 20:18:23 |
内存使用 |
0.29 MiB |
显示代码纯文本
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int k,dis[25];
double n[25][25],x[25],y[25],sum,min;
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void sv(int a,int b)
{
int i,j;
for(i=a,j=b;i<=j;i++,j--)
swap(&dis[i],&dis[j]);
}
double solve()
{
int i,a,b,j;
double t=0;
for(i=1;i<=100;i++)
{
a=rand()%(k)+1;
b=rand()%(k)+1;
swap(&dis[a],&dis[b]);
}
for(i=1;i<k;i++)
for(j=i+1;j<=k;j++)
if(n[dis[i-1]][dis[i]]+n[dis[j]][dis[j+1]]>n[dis[i-1]][dis[j]]+n[dis[i]][dis[j+1]])
sv(i,j);
for(i=1;i<k;i++)
t+=n[dis[i]][dis[i+1]];
return t;
}
int main()
{
int i,j;
double t;
freopen("linec.in","r",stdin);
freopen("linec.out","w",stdout);
scanf("%d",&k);
for(i=1;i<=k;i++)
{
scanf("%lf %lf",&x[i],&y[i]);
for(j=1;j<i;j++)
n[j][i]=n[i][j]=sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
n[i][i]=0;
}
for(i=1;i<=k;i++)
dis[i]=i;
sum=199999999;
for(i=1;i<=2000;i++)
{
t=solve();
if(t<sum) sum=t;
}
printf("%.2lf",sum);
return 0;
}