Submit
Statistic
Discuss
Problem Description
小金不喜欢别人叫他小金了,所以他强行换了一个名字叫做小银。
小银是一个故事的人,旅游是他最喜欢的事情,因为若干年后,他想把一个又一个的旅行故事讲给他的孩子们。
寒假的某一天,他来到了美丽的淄博,他决定用几天时间把淄博的景点逛一逛,完成他旅行日记的下一个美丽故事。
老韩告诉他淄博一共有n个景点,之后给了他一张旅行专用地图,上面标记了所有景点的位置。
小银又向小标打听到每个景点之间坐车的费用是 k 元 / m。
小银又向小飞打听到只要一条路线之前已经交过坐车费用,下次再经过这条路线的时候就不用再付费了。
so,小银出发了。
Input
多组输入。
每组第一行两个数n,k。分别代表景点个数和坐车的花费(元/m),详情见问题描述。
接下来的n行,每行两个数x和y,代表第i个景点的坐标。
1 <= n <= 100
1 <= k <= 10
|x|<=1000
|y| <=1000
Output
输出占一行。
输出一个浮点数c,代表小银逛完所有的景点最少需要花费多少钱。(保留2位小数)
Sample Input
3 2.0
0 0
1.0 1.0
0 1.0
Sample Output
4.00
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define inf 99999999
double ma[110][110],dis[110],fi;
int vis[110];
struct node
{
double x,y;
} k[110];
void prime(int n)
{
int i,j,k;
double mi,sum=0;
memset(vis,0,sizeof(vis));
for(i=1; i<=n; i++)
{
dis[i]=ma[1][i];
}
vis[1] = 1;
for(i=1; i<=n; i++)
{
mi=inf;
for(j=1; j<=n; j++)
{
if(mi>dis[j]&&!vis[j])
{
mi=dis[j];
k=j;
}
}
vis[k] = 1;
if(mi==inf)
{
break;
}
sum+=mi;
for(j=1; j<=n; j++)
{
if(dis[j]>ma[k][j]&&!vis[j])
{
dis[j]=ma[k][j];
}
}
}
printf("%.2lf\n",sum*fi);
}
int main()
{
int n,i,j;
while(~scanf("%d %lf",&n,&fi))
{
for(i=1; i<=n; i++)
{
scanf("%lf %lf",&k[i].x,&k[i].y);
}
for(i=1; i<=n; i++)
{
for(j=i; j<=n; j++)
{
if(i!=j)
{
ma[i][j]=ma[j][i] =sqrt((k[i].x-k[j].x)*(k[i].x-k[j].x)+(k[i].y-k[j].y)*(k[i].y-k[j].y));
}
else
{
ma[i][j]=ma[j][i] = 0;
}
}
}
prime(n);
}
return 0;
}