【题解】LuoGu1265:公路修建

原题传送门
这题题面看起来就是在讲一个算法的流程,然后是求最小生成树,用 k r u s k a l kruskal 罕见的会爆内存,然而这题允许 O ( n 2 ) O(n^2) 的复杂度,就用传说中的 p r i m prim 解决

Code:

#include <bits/stdc++.h>
#define maxn 5010
#define LL long long
using namespace std;
double x[maxn], y[maxn], dis[maxn], ans;
int n, vis[maxn];

inline int read(){
	int s = 0, w = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
	for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
	return s * w;
}

double calc(int i, int j){ return sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])); }

int main(){
	n = read();
	for (int i = 1; i <= n; ++i) x[i] = read(), y[i] = read();
	for (int i = 2; i <= n; ++i) dis[i] = 1e9;
	for (int i = 1; i <= n; ++i){
		int p = -1;
		for (int j = 1; j <= n; ++j)
			if (!vis[j] && (p == -1 || dis[p] > dis[j])) p = j;
		vis[p] = 1, ans += dis[p];
		for (int j = 1; j <= n; ++j) dis[j] = min(dis[j], calc(p, j));
	}
	printf("%.2lf\n", ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ModestCoder_/article/details/108309021
今日推荐