1. 程式人生 > >hdu 1162 最小生成樹模板 Eddy's picture

hdu 1162 最小生成樹模板 Eddy's picture

題意:給出n個點,求n個點連線或者間接連線的最小距離。最小生成樹

兩個點!! 1.多組資料,接收到EOF  (WA了好幾發) 2.注意double 好長時間沒寫題,簡單題都get不到點了。

#pragma GCC optimize(2)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<set>
#include<vector>
#include<string>
#include<queue>
#include<math.h>
using namespace std;
const int maxn = 500;
const int inf = 0x3f3f3f3f;
typedef long long ll;
struct node
{
	int x, y;
	double dist;
}edge[maxn*maxn];
struct point
{
	double x, y;
}poin[maxn*maxn];
int f[maxn];
double dis(double a, double b, double c, double d)
{
	double fa = c - a;
	double fb = d - b;
	return sqrt(fa * fa + fb * fb);
}
bool cmp(node &a, node &b)
{
	return a.dist < b.dist;
}
int finda(int a)
{
	if (a != f[a])
	{
		return f[a] = finda(f[a]);
	}
	else
	{
		return a;
	}
}
int main()
{
	//freopen("C://input.txt", "r", stdin);
	int n;
	while (scanf("%d", &n) != EOF)
	{
		int k = 0;
		double ans = 0;
		for (int i = 1; i <= n; i++)
		{
			scanf("%lf%lf", &poin[i].x, &poin[i].y);
			f[i] = i;
		}
		for (int i = 1; i <= n; i++)
		{
			for (int j = i + 1; j <= n; j++)
			{
				edge[k].x = i;
				edge[k].y = j;
				edge[k++].dist = dis(poin[i].x, poin[i].y, poin[j].x, poin[j].y);
			}
		}
		sort(edge, edge + k, cmp);
		for (int i = 0; i < k; i++)
		{
			int fa = edge[i].x;
			int fb = edge[i].y;
			if (finda(fa) != finda(fb))
			{
				ans += edge[i].dist;
				f[finda(fa)] = finda(fb);
			}
		}
		printf("%.2lf\n", ans);
	}
	return 0;
}