P2504 [HAOI2006]聪明的猴子

mac2024-05-27  55

题目

P2504 [HAOI2006]聪明的猴子

分析

kruskal算法模板

AC代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; int temp[5005], x[5005], y[5005], f[5005]; struct Edge{ int u; int v; double w; }edge[1000005]; int cnt; int getf(int x) { if (x == f[x]) { return x; } int fx = getf(f[x]); return f[x] = fx; } int cmp(Edge a, Edge b) { return a.w < b.w; } int merge(int u, int v) { int t1 = getf(f[u]); int t2 = getf(f[v]); if (t1 != t2) { f[t1] = t2; return 1; } return 0; } int main() { int n, m; scanf("%d", &m); for (int i = 1; i <= m; i++) { scanf("%d", &temp[i]); } scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &x[i], &y[i]); } for (int i = 1; i <= n; i++) { f[i] = i; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { double w = sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2)) ; edge[++cnt] = {i, j, w}; } } sort(edge + 1, edge + cnt + 1, cmp); int t = 0; double maxLength = -1; for (int i = 1; i <= cnt; i++) { if (merge(edge[i].u, edge[i].v)) { t++; maxLength = max(maxLength, edge[i].w); } if (t == n - 1) { break; } } int ans = 0; for (int i = 1; i <= m; i++) { if (temp[i] >= maxLength) { ans++; } } printf("%d\n", ans); return 0; }
最新回复(0)