HDU 1875 畅通工程再续 (Prim)

Description

相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 

Input

输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。 
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。 
 

Output

每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
 

Sample Input

      
      
      
      
2 2 10 10 20 20 3 1 1 2 2 1000 1000
 

Sample Output

      
      
      
      
1414.2 oh!


Prime算法搞就行了;

多了 一个计算距离的步骤;(函数是double不能是int,否则返回会被强制转换)

如果是define 了 MAX , 请变为浮点类型;

别忘了特判条件;

AC代码:

#include <bits/stdc++.h>
#define MAX 99999999.000
using namespace std ;
double ma[200][200]  , dis[200];
int m , vis[200] ;
struct node {
	int x ;
	int y ;
}n[200];

double sum(int x1 , int y1 , int x2 , int y2)
{
	double t ;
	t = 1.0*((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	return (double)sqrt(t);
}

void prime()
{
	double mini ;
	double ans = 0.0;
	int k ;
	memset(vis,0,sizeof(vis));
	for(int i = 1 ; i < m ; i++)
	{
		dis[i] = ma[0][i];
	}
	vis[0]=1;
	for(int i = 1 ; i < m ; i++)
	{
		mini = MAX;
		for(int j = 0 ; j  < m ; j++)
		{
			if(!vis[j]&&mini>dis[j])
			{
				mini = dis[j];
				k = j ;
			}
		}
		if(mini == MAX)
		{
			printf("oh!\n");
			return ;
		}
		ans += dis[k];
		vis[k]=1;
		for(int j = 0 ; j < m ; j++)
		{
			if(!vis[j]&&dis[j]>ma[k][j])
			{
				dis[j]=ma[k][j];
			}
		}
	}
	printf("%.1f\n",ans*100);
}

int main()
{
	int t ;
	cin>>t;
	while(t--)
	{
		cin>>m;
		for(int i = 0 ; i<m;i++)
		{
			cin>>n[i].x>>n[i].y;
		}
		for(int  i = 0 ;  i < m ; i++)
		{
			for(int j = 0 ; j < m ; j++)
			{
				if(i==j)
				{
					continue ;
				}
				int x1  = n[i].x  ; int  y1 = n[i].y;
				int x2  = n[j].x  ; int  y2 = n[j].y;
				double dist = 1.0*sum(x1,y1,x2,y2);
				if(dist<10.0||dist>1000.0)
				ma[i][j]= ma[j][i] = MAX;
				else 
				{
					ma[i][j]=ma[j][i]=dist;
				}	
			}
		}
		prime();
	}
	return 0 ;
}



你可能感兴趣的:(HDU 1875 畅通工程再续 (Prim))