TAG
- 模板题、算法 − 【图论 − 最小生成树 − K r u s k a l 】 模板题、算法 - 【图论 - 最小生成树 - Kruskal】 模板题、算法−【图论−最小生成树−Kruskal】时间复杂度
- O ( N ∗ log N ) O(N \ast \log N) O(N∗logN)
//
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define data da
const int N = 2222;
int in[N], x[N], y[N], dad[N];
int n, m;
double maxx;
struct A {
int x, y;
double data;
bool operator < (const A& in) const {
return data < in.data;
}
};
vector<A> e;
int get_dad(int x) {
return dad[x] = dad[x] == x ? x : get_dad(dad[x]);
}
bool kruskal() {
sort(e.begin(), e.end()); //
for (int i = 1; i <= n; i++) dad[i] = i;
int cnt = 0;
for (auto [x, y, data] : e) {
x = get_dad(x);
y = get_dad(y);
if (x != y) {
dad[x] = y;
maxx = max(maxx, data);
cnt++;
}
}
return cnt == n - 1;
}
void solve() {
scanf("%d", &m);
for (int i = 1; i <= m; i++) scanf("%d", &in[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++) {
for (int j = i + 1; j <= n; j++) {
e.push_back((A){i, j, sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]))});
}
}
kruskal();
int ans = 0;
for (int i = 1; i <= m; i++) {
ans += (in[i] >= maxx);
}
printf("%d\n", ans);
}
signed main() {
int t = 1;
// scanf("%d", &t);
while (t--) solve();
return 0;
}
实现细节
排序
参考示意图
-
`
参考链接
作者 | 乐意奥AI