poj 2560

题意:有n个点,并且知道它们的坐标,求连接所有点的最短路径。

代码:

#include<iostream>
#include<fstream>
#include<cmath>

using namespace std;

double x[101],y[101];

double d[101];
double w[101][101];

int v[101];
int n;

void read(){
//	ifstream cin("in.txt");
	int i,j,k;
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>x[i]>>y[i];
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			w[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			w[j][i]=w[i][j];
		}
	double ans=0;
	for(i=1;i<=n;i++)
		d[i]=w[1][i];

	while(1){
		double minn=100000000;
		j=-1;
		for(i=1;i<=n;i++)
			if(v[i]==0&&minn>d[i])
			{
				j=i;
				minn=d[i];
			}
		if(j==-1)
		{
			printf("%.2lf\n",ans);
			return;
		}
		ans+=d[j];
		v[j]=1;
		for(i=1;i<=n;i++)
			if(v[i]==0&&d[i]>w[i][j])
				d[i]=w[i][j];
	}
}

int main(){
	read();
	return 0;
}

posted on 2011-05-17 16:17  宇宙吾心  阅读(413)  评论(0)    收藏  举报

导航