刚开始没有理解题意,以为是最短路径,后来才发现是prim,哎,无语。。。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int maxn=201;
const double INF=2<<20;
double x[maxn],y[maxn],edge[maxn][maxn];
int n;
double getd(int k,int j)
{
	double ex=(x[k]-x[j])*(x[k]-x[j]);
	double ey=(y[k]-y[j])*(y[k]-y[j]);
	return sqrt(ex+ey);
}
double prim()
{
	int i,j;
	double low[maxn];
	int path[maxn],vis[maxn];
	path[1]=0;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			edge[i][j]=getd(i,j);
	}
	for(i=1;i<=n;i++)
	{
		low[i]=i==1?0:INF;
		vis[i]=0;
	}
	double min;
	int k;
	for(i=1;i<=n;i++)
	{
		min=INF;
		for(j=1;j<=n;j++)
		{
			if(min>low[j]&&!vis[j])
			{
				min=low[j];
				k=j;
			}
		}
		vis[k]=1;
		for(j=1;j<=n;j++)
		{
			if(low[j]>edge[k][j]&&!vis[j])
			{
				low[j]=edge[k][j];
				path[j]=k;
			}
		}
	}	
	double max=-1;
	i=2;
	while(i)
	{
		if(max<edge[path[i]][i])
			max=edge[path[i]][i];
		i=path[i];
	}
	return max;
}
int main()
{
	int t=0;
	while(cin>>n&&n)
	{
		t++;
		for(int i=1;i<=n;i++)
			cin>>x[i]>>y[i];
		double ou=prim();
		printf("Scenario #%d\n",t);
		printf("Frog Distance = %.3lf\n",ou);
		printf("\n");
	}
	return 0;
}


posted on 2012-10-27 15:57  lishimin_come  阅读(86)  评论(0编辑  收藏  举报