| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
超时一百年,求大神帮解决In Reply To:最小生成树水过~~~~~~~~~~~~~~~~ Posted by:nvliba at 2015-08-12 09:16:21 #include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
using namespace std;
double c[510][510],d[510];
int a[510][2],b[510],k1,min1=1000000,p,s;
void hh(int i,int j)
{
if(c[i][j]!=-1&&b[j]!=0&&min1>c[i][j])
{
min1=c[i][j];
k1=j;
}
else if(c[j][i]!=-1&&b[j]!=0&&min1>c[j][i])
{
min1=c[j][i];
k1=j;
}
if(j<p)return;
hh(i,j+1);
}
void rrrr()
{
int i,j,x,y;
for(i=1;i<p;i++)
for(j=i+1;j<=p;j++)
{
if(a[i][0]==a[j][0])c[i][j]=(a[i][1]>a[j][1])?a[i][1]-a[j][1]:a[j][1]-a[i][1];
else {if(a[i][0]>a[j][0])x=a[i][0]-a[j][0];
else x=a[j][0]-a[i][0];
y=(a[i][1]>a[j][1])?a[i][1]-a[j][1]:a[j][1]-a[i][1];
c[i][j]=(double)sqrt((double)(x*x+y*y));
}
}
}
void add()
{
int i,j,k,sum;
for(i=1;i<=p;i++)
for(j=1;j<=p;j++)
c[i][j]=-1;
rrrr();
b[1]=0;k=0;
while(1)
{min1=1000000;
for(j=1;j<=p;j++)
if(b[j]==0)hh(j,1);
if(min1!=1000000)
{
d[k++]=min1;
b[k1]=0;
}
sum=0;
for(i=1;i<=p;i++)
sum+=b[i];
if(sum==0)break;
}
sort(d,d+k);
k=k-s/2;
printf("%.2f\n",d[k-1]);
}
int main()
{int n,i,j;
cin>>n;
while(n--)
{
cin>>s>>p;
for(i=1;i<=p;i++)
{
cin>>a[i][0]>>a[i][1];
b[i]=1;
}
add();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator