0829-T4 太空帝国
0829-T4 太空帝国
题意
给定一个图有
点
求该图的最小生成树。
思路
暴力建图不能通过。
对最小生成树有贡献的边只可能连在按
以按
排序后,对于
左右两边对于边权的贡献都一样,而右边多连了一个点,在最小生成树中更优。
证明
这样只有
时间复杂度:
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 3e5 + 5;
struct point {ll x, y, z, id;};
struct edge {ll x, y, z;};
struct DSU {
int fa[N];
void init(int n) {for (int i = 1; i <= n; i ++) fa[i] = i;}
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx == fy) return ;
fa[fx] = fy;
}
bool same(int x, int y) {return find(x) == find(y);}
};
ll Abs(ll num) {return num > 0 ? num : -num;}
ll dis(point a, point b) {return min(Abs(a.x - b.x), min(Abs(a.y - b.y), Abs(a.z - b.z)));}
bool cmp(edge a, edge b) {return a.z < b.z;}
bool cmp1(point a, point b) {return a.x < b.x;}
bool cmp2(point a, point b) {return a.y < b.y;}
bool cmp3(point a, point b) {return a.z < b.z;}
int n; ll ans;
point p[N];
vector <edge> v;
DSU dsu;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> p[i].x >> p[i].y >> p[i].z, p[i].id = i;
sort(p + 1, p + n + 1, cmp1);
for (int i = 1; i < n; i ++)
v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
sort(p + 1, p + n + 1, cmp2);
for (int i = 1; i < n; i ++)
v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
sort(p + 1, p + n + 1, cmp3);
for (int i = 1; i < n; i ++)
v.push_back({p[i].id, p[i + 1].id, dis(p[i], p[i + 1])});
sort(v.begin(), v.end(), cmp);
dsu.init(n);
for (unsigned i = 0; i < v.size(); i ++) {
ll x = v[i].x, y = v[i].y, z = v[i].z;
if (dsu.same(x, y)) continue;
dsu.merge(x, y);
ans += z;
}
cout << ans << "\n";
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18387437,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】