记录编号 56502 评测结果 AAAAAAAAAA
题目名称 公路修建 最终得分 100
用户昵称 GravatarQhelDIV 是否通过 通过
代码语言 C++ 运行时间 1.619 s
提交时间 2013-03-31 10:00:15 内存使用 3.37 MiB
显示代码纯文本
//prime
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <memory.h>
#include <cmath>
#define F_I "roadz.in"
#define F_O "roadz.out"
using namespace std;
ifstream fin(F_I);
ofstream fout(F_O);
const int Vn_Max=5001;
const double Inf=123456789.0;
int En,Vn;
/*
class Edge
{
public:
	short int u,v;
	double w;
}E[Vn_Max*Vn_Max];*/
class Node{
public:
	long long x,y;
}V[Vn_Max];
void init()
{
int i,j;
	fin>>Vn;
	for(i=1;i<=Vn;i++)
		fin>>V[i].x>>V[i].y;
	/*
	for(i=1;i<=Vn;i++)
		for(j=i+1;j<=Vn;j++)
		{
			E[++En].u=i;
			E[En].v=j;
			E[En].w=double(sqrt(double( (V[i].x-V[j].x)*(V[i].x-V[j].x)+(V[i].y-V[j].y)*(V[i].y-V[j].y))));
		}
	*/
}
class UFSet{
public:
	short Prev[Vn_Max];
	UFSet(){for(int i=1;i<Vn_Max;i++)Prev[i]=i;}
	short fr(short o)
	{
		if(Prev[o]!=o)
			Prev[o]=fr(Prev[o]);
		return Prev[o];
	}
	void Union(short a,short b)
	{
	short ra=fr(a),rb=fr(b);
		Prev[rb]=ra;
	}
}UFS;
/*
bool Cmp(Edge a,Edge b){
	return a.w<b.w;
}
void K(){
double Ans=0.0;
	sort(E+1,E+En+1,Cmp);
	for(int i=1;i<=En;i++)
	{
		if(UFS.fr(E[i].u)!=UFS.fr(E[i].v))
		{
			UFS.Union(E[i].u,E[i].v);
			Ans+=E[i].w;
		}
	}
	fout<<setiosflags(ios::fixed)<<setprecision(2)<<Ans<<endl;
}
*/
double D(int a,int b){
	return sqrt(double((V[a].x-V[b].x)*(V[a].x-V[b].x) + (V[a].y-V[b].y)*(V[a].y-V[b].y)));
}
void P(){
double d[Vn_Max],Ans=0.0;
bool flag[Vn_Max]={0};
	d[1]=0;
	for(int i=2;i<=Vn;i++)
		d[i]=Inf;
	for(int i=1;i<=Vn;i++)
	{
	double Min=Inf;
	int Mp=0;
		for(int j=1;j<=Vn;j++)	
			if(!flag[j] && Min>d[j])
			{
				Min=d[j];
				Mp=j;
			}
		flag[Mp]=true;
		Ans+=Min;
		for(int j=1;j<=Vn;j++)
			if(!flag[j])
				d[j]=min(d[j],D(Mp,j));
	}
	fout<<setiosflags(ios::fixed)<<setprecision(2)<<Ans<<endl;
}
int main()
{
	init();
	
	//K();
	P();
	
	fin.close();
	fout.close();
	return 0;
}