码迷,mamicode.com
首页 > 其他好文 > 详细

tyvj 1169

时间:2014-11-16 10:34:37      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:des   http   io   ar   os   sp   for   数据   on   

描述 Description

一个平面内有N个点,你的任务是将这N个点配对(N为偶数,且<=20),使得每一个点恰好在一个配对中,所有点对中两点距离之和最小。

输入格式 InputFormat

第一行n
接下来的n行,每行两个整数,表示横纵坐标

输出格式 OutputFormat

一个数,所有点对中两点距离之和最小值 精确到小数点后两位

样例输入 SampleInput [复制数据]

4

1 1

1 2

100 1

100 2

 

样例输出 SampleOutput [复制数据]

2.00

 

#include<iostream>

#include<cstdio>

#include<cstring>

#include<cstdlib>

#include<cmath>

#include<string>

#include<algorithm>

using namespace std;

#define SIZE 22

#define INF 99999999

float p[SIZE][2];

float dist[SIZE][SIZE];

double ans=INF;

int tag[SIZE];

int N;

 

int search(int depth,double s)

{

if(2*depth==N)

{

if(s<ans) ans=s;

return 0;

}

int i,node;

double tmp;

for(i=0;i<N;i++)

if(!tag[i])

{

node=i;

break;

}

tag[node]=1;

for(;i<N;i++)

if(!tag[i] && (tmp=s+dist[node][i])<ans)

{

tag[i]=1;

search(depth+1,tmp);

tag[i]=0;

}

tag[node]=0;

return 0;

}

 

int main(void)

{

int i,j;

double dx,dy;

scanf("%d",&N);

for(i=0;i<=N;i++)

scanf("%f%f",p[i],p[i]+1);

for(i=0;i<N;i++)

for(j=i+1;j<N;j++)

{

dx=p[i][0]-p[j][0];

dy=p[i][1]-p[j][1];

dist[i][j]=sqrt(dx*dx+dy*dy);

}

search(0,0);

printf("%.2lf",ans);

return 0;

}

tyvj 1169

标签:des   http   io   ar   os   sp   for   数据   on   

原文地址:http://www.cnblogs.com/a972290869/p/4101035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!