记录编号 9978 评测结果 AAAAAAAAAA
题目名称 公路修建 最终得分 100
用户昵称 GravatarBYVoid 是否通过 通过
代码语言 C++ 运行时间 2.139 s
提交时间 2009-04-23 13:50:59 内存使用 0.35 MiB
显示代码纯文本
/* 
 * Problem: HAOI2008 parterre
 * Author: Guo Jiabao
 * Time: 2009.4.23 13:33
 * State: Solved
 * Memo: 最小生成树
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
const int MAXN=5001;
const double INF=1e20;
using namespace std;
struct point
{
	int x,y;
}P[MAXN];
double mst[MAXN];
int cls[MAXN],N;
void init()
{
	freopen("roadz.in","r",stdin);
	freopen("roadz.out","w",stdout);
	scanf("%d",&N);
	for (int i=1;i<=N;i++)
		scanf("%d%d",&P[i].x,&P[i].y);
}
inline double w(int a,int b)
{
	double x=P[a].x - P[b].x,y=P[a].y - P[b].y;
	return sqrt(x*x+y*y);
}
void prim()
{
	int i,j,k;
	double Min,delta;
	for (i=1;i<=N;i++)
		mst[i]=INF;
	for (i=1;i;)
	{
		mst[i]=-INF;
		for (j=1;j<=N;j++)
			if ((delta=w(i,j))<mst[j])
			{
				mst[j]=delta;
				cls[j]=i;
			}
		Min=INF;k=0;
		for (j=1;j<=N;j++)
			if (mst[j]!=-INF && mst[j]<Min)
			{
				Min=mst[j];
				k=j;
			}
		i=k;
	}
}
void print()
{
	int i;double Ans=0;
	for (i=2;i<=N;i++)
		Ans +=w(i,cls[i]);
	printf("%.2lf\n",Ans);
}
int main()
{
	init();
	prim();
	print();
	return 0;
}