hdu 1875

prim算法,用double,我第一次用float wa,看了别人代码改成double就过了。

#include<stdio.h>
#include<math.h>
#define N 110
#define max 9999999
double g[N][N];
void prim(int n)
{
	int i,j,u,flag,mark[N];
	double dis[N],cost,min;
	for(i=0;i<n;i++)
	{
		mark[i]=0;
		dis[i]=g[0][i];
	}
	mark[0]=1;
	cost=0;
	flag=1;
	for(i=1;i<n;i++)
	{
		min=max;
		for(j=1;j<n;j++)
			if(!mark[j]&&min>dis[j])
			{
				u=j;
				min=dis[j];
			}
		if(min==max||min<10)
		{
			flag=0;
			break;
		}
		mark[u]=1;
		cost+=min;
		for(j=1;j<n;j++)
			if(!mark[j]&&dis[j]>g[u][j])
				dis[j]=g[u][j];
	}
	if(flag)
		printf("%.1f\n",100*cost);
	else
		printf("oh!\n");
}
int main()
{
	int i,j,m,n,x[N],y[N];
	double dis,x2,y2;
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d",&n);
		for(i=0;i<n;i++)
			scanf("%d%d",&x[i],&y[i]);
		for(i=0;i<n;i++)
			for(j=0;j<=i;j++)
			{
				x2=(x[i]-x[j])*(x[i]-x[j]);
				y2=(y[i]-y[j])*(y[i]-y[j]);
				dis=sqrt(x2+y2);
				if(dis<10||dis>1000)
					g[j][i]=g[i][j]=max;
				else
					g[i][j]=g[j][i]=dis;
			}
		prim(n);
	}
	return 0;
}

posted on 2010-03-24 16:59  草头菜  阅读(560)  评论(0编辑  收藏  举报

导航