Description
成大事者,不惟有超世之才,亦有坚忍不拔之志。
秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金。为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱。假设现在有$n$家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为($x_i$, $y_i$)。为了方便交通,他打算在一些快餐店之间修建道路使得任意一家快餐店都能够通过道路到达某一家旗舰店。
但是秋实大哥忙于赚钱和过节,没有时间来设计道路,你能帮助秋实大哥算出最少一共需要修建多长的道路吗?
Input
第一行一个整数$n$,表示快餐店的个数。(n<= 6666)
接下来n行,每行两个整数x,y,(-1000000< =x_,y_<= 1000000)。表示第i家快餐店的位置(x,y),如果i=0表示该店是普通的分店,如果 i=1表示该店是旗舰店。
保证至少有一家旗舰店
Output
输出最少一共需要修建的道路长度,保留小数点后两位。
Sample Input
3
1 -1 0
1 1 0
0 0 1
Sample Output
2.83
Hint
#include<stdio.h>
#include<string.h>
#include<math.h>
float distance(int x,int y,int x1,int y1);
int point[6666][2];
float e[6666][6666];
float dis[6666];
int book[6666];
float inf=999999;
int star;
int flag,n;
int main()
{
int i,j,min,minx;
float sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j) e[i][j]=0;
else e[i][j]=inf;
}
}
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&point[i][0],&point[i][1],&flag);
if(flag==1) star=i;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
e[i][j]=distance(point[i][0],point[i][1],point[j][0],point[j][1]);
}
}
for(i=1;i<=n;i++)
{
dis[i]=e[star][i];
}
book[star]=1;
for(j=1;j<=n-1;j++)
{
min=inf;
for(i=1;i<=n;i++)
{
if(min>dis[i]&&book[i]==0)
{
min =dis[i];
minx=i;
}
}
sum=sum+dis[minx];
//printf("%f\n",sum);
book[minx]=1;
for(i=1;i<=n;i++)
{
if(dis[i]>e[minx][i]&&book[i]==0)
{
dis[i]=e[minx][i];
}
}
}
//for(i=1;i<=n;i++) printf("%f ",dis[i]);
//printf("\n\n");
printf("%.2f",sum);
return 0;
}
float distance(int x,int y,int x1,int y1)
{
return (float)sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}