码迷,mamicode.com
首页 > 编程语言 > 详细

POJ 2560 Freckles Prime问题解决算法

时间:2015-07-10 18:45:13      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

这个问题正在寻求最小生成树。

给定节点的坐标,那么我们需要根据各个点之间的这些坐标来计算距离。

除了这是标准的Prime算法的,能源利用Prime基本上,你可以使用Kruskal。

经典的算法必须填写,熟练度。否则它是非常困难的利用。

并且经典的算法之所以为经典。原因之中的一个是没那么easy自己凭空想象出来的,所以要熟练。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <float.h>
#include <algorithm>
#include <math.h>
using namespace std;

struct Point
{
	float x, y;
};
const int MAX_N = 101;
Point P[MAX_N];
bool vis[MAX_N];
float dist[MAX_N];
float minDist[MAX_N];

float calDist(Point &a, Point &b)
{
	float x = a.x - b.x;
	float y = a.y - b.y;
	return sqrtf(x*x + y*y);
}

void Prime(int n)
{
	memset(vis, 0, sizeof(bool) * (n+1));
	vis[1] = true;
	dist[1] = 0;
	for (int i = 2; i <= n; i++)
	{
		dist[i] = calDist(P[1], P[i]);
	}
	
	for (int i = 1; i < n; i++)
	{
		float minD = FLT_MAX;
		int id = 0;
		for (int j = 2; j <= n; j++)
		{
			if (!vis[j] && dist[j] < minD)
			{
				minD = dist[j];
				id = j;
			}
		}
		vis[id] = true;
		minDist[i] = minD;
		for (int j = 2; j <= n; j++)
		{
			if (!vis[j])
			{
				float d = calDist(P[id], P[j]);
				if (d < dist[j]) dist[j] = d;
			}
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%f %f", &P[i].x, &P[i].y);
	}
	Prime(n);
	float ans = 0.f;
	for (int j = 1; j < n; j++)
	{
		ans += minDist[j];
	}
	printf("%.2f\n", ans);
	return 0;
}


版权声明:本文博客原创文章。博客,未经同意,不得转载。

POJ 2560 Freckles Prime问题解决算法

标签:

原文地址:http://www.cnblogs.com/mengfanrong/p/4636417.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!