现在的位置: 首页 > 综合 > 正文

poj2031 prim

2013年08月16日 ⁄ 综合 ⁄ 共 1128字 ⁄ 字号 评论关闭

prim水题,别被3D吓到。

注意相交情况和浮点数的比较就行了。

//296K 32ms
#include <iostream>
#include <cmath>
using namespace std;

#define INF 10000.000
#define SIZE 102
#define EPS 1e-10
int n;
double graph[SIZE][SIZE], dist[SIZE];
bool visit[SIZE];

struct Node
{
	double x, y, z, r;
} node[SIZE];

double cal_dis(Node *a, Node *b)
{
	double ans = sqrt(pow(a->x-b->x,2.0)+pow(a->y-b->y,2.0)+pow(a->z-b->z,2.0))-a->r-b->r;
	if(fabs(ans) < EPS)
		return 0.0;
	else return ans > 0.0 ? ans : 0.0;
}

double Prim()
{
	double min_value, tmp;
    int i, j, curr;

	memset(visit, false, sizeof(visit));
	for(i = 1; i < n; i++)
		dist[i] = INF;
	dist[0] = 0.000;
    min_value = 0.000;

	for(j = 0; j < n; j++)
	{
         tmp = INF;
		 curr = -1;
		 for(i = 0; i < n; i++)
		 {
			 if(!visit[i] && dist[i] < tmp)
			 {
				 tmp = dist[i];
				 curr = i;
			 }
		 }

		 if(curr == -1)
			 break;
		 min_value += tmp;
		 visit[curr] = true;
		 for(i = 0; i < n; i++)
			 if(!visit[i] && graph[curr][i] < dist[i])
				 dist[i] = graph[curr][i];
	}
    return min_value;
}
int main()
{
	int i, j;
    double x, y, z, r;
//	freopen("a.txt","r",stdin);
	while(scanf("%d", &n) && n)
	{
        for(i = 0; i < n; i++)
        {
			scanf("%lf%lf%lf%lf", &x, &y, &z, &r);
			node[i].x = x;
			node[i].y = y;
			node[i].z = z;
			node[i].r = r;
		}
		for(i = 0; i < n; i++)
			for(j = i; j < n; j++)
			{
				if(i == j)
					graph[i][j] = 0.000;
				else
				{
					graph[i][j] = cal_dis(&node[i], &node[j]);
					graph[j][i] = graph[i][j];
				}
			}
        printf("%.3lf\n", Prim());
	}
	return 0;
}

 

抱歉!评论已关闭.