hdu1162

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int n;
int cnt;
int f[105];
struct node
{
	int u, v;
	double w;
	bool operator <(const node &a)const{
		return w < a.w; 
	}
}a[5005];

int Find(int x){
	return x == f[x] ? x : Find(f[x]);
}

void kruskal(){
	sort(a, a + cnt);
	int tot = 0;
	double ans = 0;
	for (int i = 1; i <= n; i++) f[i] = i;
	for (int i = 0; i < cnt; i++){
		int x = Find(a[i].u), y = Find(a[i].v);
		if(x != y){
			f[x] = y;
			tot++;
			ans += a[i].w;
			if(tot == n - 1) break;
		}
	}
	printf("%.2lf\n", ans);
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	while(scanf("%d", &n) == 1){
		double x[n + 1], y[n + 1];
		cnt = 0;
		for (int i = 1; i <= n; i++){
			scanf("%lf %lf", &x[i], &y[i]);
		}
		if(n == 1){
			printf("0\n");
			continue;
		}
		for (int i = 1; i <= n; i++){
			for (int j = i + 1; j <= n; j++){
				double w = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
				a[cnt].u = i, a[cnt].v = j, a[cnt].w = w;
				cnt++;
			}
		}
		kruskal();
	}

	return 0;
}
/**/

 

全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务