HDU 携程编程大赛 1003 携程全球数据中心建设 Prim OR Kruskal

本文介绍了一种利用最小生成树算法解决特定问题的方法。通过计算二维平面上各点之间的距离并构建最小生成树来判断是否满足给定条件。文章详细展示了使用C++实现的全过程,包括距离计算和Prim算法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

水题

先求两两间的长度,再求最小生成树

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
#define BUG puts("HERE!")
using namespace std;
const int MAX = 105;
const double INF = 0x7fffff;
const double eps = 1e-5;
const double PI = 3.14159265358979323846;
double dis[MAX][MAX], x[MAX], y[MAX];
double dist[MAX];
int t, c;
double d, l;
bool vis[MAX];

double prim(int n) {  
	int i,j,pos;  
	double sum=0,min;
	memset(vis,false,sizeof(vis));
	for(i=1; i<=n; i++) {  
		dist[i]=dis[1][i];  
	}
	vis[1] = true; 
	dist[1] = INF;
	for(i=1; i<n; i++) {  
		min = INF;
		for(j = 1; j <= n; j++) {  
			if(!vis[j] && dist[j] < min) {  
				min = dist[j];  
				pos = j;  
			}  
		}  
		sum += dist[pos];
		vis[pos] = true; 
		for(j = 1; j <= n; j++) {  
			if(!vis[j] && dist[j] > dis[pos][j]) {  
				dist[j] = dis[pos][j];
			}  
		}  
	}  
	return sum;  
} 

double dd(double x1, double y1, double x2, double y2){
	return fabs(d / 2  *acos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2)));
}

int main(int argc, char const *argv[]){

#ifndef ONLINE_JUDGE
	freopen("in.in", "r", stdin);
	// freopen("out.out", "w", stdout);
#endif

	cin >> t;
	while (t --){
		cin >> d >> l >> c;
		for (int i = 1; i <= c; ++i){
			cin >> x[i] >> y[i];
			x[i] = x[i] * PI / 180.0;
			y[i] = y[i] * PI / 180.0;
		}
		for (int i = 1; i <= c; ++i){
			for (int j = 1; j <= c; ++j){
				if(i == j)
					dis[i][j] = 0;
				else
					dis[i][j] = dd(x[i], y[i], x[j], y[j]);
			}
		}
		double ans = prim(c);
		if(ans < l)
			puts("Y");
		else
			puts("N");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值