\(Kruskal\) 算法

Luogu P3366 为例题

实现方法:从小到大遍历每一条线,如果该线连接的两点已经都在树内则不处理,否则描出这条线

从小到大是一个贪心的实现方法,由于每描出一条线,就会生成一棵新的树或将一个点加入一棵树中。第一个点不需要连线处理,因此描出这棵树所需要的边的数量一定是这棵树的点的数量减一(也许树本身就存在这样的性质?)

当然,有一个例外,那就是给出的图不连通

我们暂时不用考虑图的连通性的问题,因为例题给出的要求是:对于所有不连通的图,输出 orz

使用并查集维护该树

示例代码:

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

pair<int, pair<int, int>> g[N];  // The weight on the line between Point A and Point B, Point A, Point B

int fa[N];  // Father Point

int f(int x) {  // Finding Point X's Extra Grandpa
if (fa[x] == x) return x;
return fa[x] = f(fa[x]); // Disjoint Set Union path compression
} int main() {
int m, n;
cin >> n >> m;
for (int i = 1, u, v, w; i <= m; i++) // Saving
cin >> u >> v >> w,
g[i].first = w,
g[i].second.first = u,
g[i].second.second = v;
for (int i = 1; i <= n; i++) fa[i] = i; // Initialize All Points' Father as themselves
sort(g + 1, g + m + 1);
int ans = 0, cnt = 0; // Use cnt to make sure that all point was connected
for (int i = 1; i <= m; i++) {
int u = g[i].second.first, v = g[i].second.second, w = g[i].first; // Reading
if (f(u) == f(v)) continue; // Had been connected
ans += w, fa[f(v)] = fa[u], cnt++; // Add the weight, connect Point V and Point U
}
if (cnt == n - 1) cout << ans << endl; // If there's n points, then there will be connecting for n - 1 times
else cout << "orz" << endl; // Some points didn't connected
return 0;
}

随机推荐

  1. ༺$Musique$༻

    往期链接在文末 最近好喜欢听一些有年代感的歌啊. ~~头图~~ <$ On\ \And \ On $> Hold me close til I get up Time is barely ...

  2. Base64 java图片工具类

    import org.springframework.util.Assert; import javax.imageio.ImageIO; import java.awt.image.Buffered ...

  3. 使用interface化解一场因操作系统不同导致的编译问题

    场景描述 起因: 因项目需求,需要编写一个agent, 需支持Linux和Windows操作系统. Agent里面有一个功能需要获取到服务器上所有已经被占用的端口. 实现方式:针对不同的操作系统,实现 ...

  4. CSS 溢出文本

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. AppFlow上新——智谱ChatGLM轻松接入聊天

    智谱AI 开放平台提供一系列具有不同功能和定价的大模型,包括通用大模型.超拟人大模型.图像大模型.向量大模型等,并且支持使用您的私有数据对模型进行微调.其中ChatGLM系列模型在国内也享有盛名,现在 ...

  6. 在Rainbond中一键部署高可用 EMQX 集群

    本文描述如何通过云原生应用管理平台 Rainbond 一键安装高可用 EMQX 集群.这种方式适合不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kubernetes 中部署 E ...

  7. vue移动端 滚动

    better-scroll: https://better-scroll.github.io/docs/zh-CN/guide/ 影院列表数据使用better-scroll来完成数据的展示,此插件对于 ...

  8. ETL工具-nifi干货系列 第十五讲 nifi处理器ConsumeKafka实战教程

    1.上一节课我们学习了处理器PushKafka,通过该处理器往kafka中间件写数据,今天我们一起学习处理器ConsumeKafka,此处理器从kafka读取数据进行后续处理,如下图所示: 本次示例比 ...

  9. Linux Topicons Plus桌面工具安装

    Topicons Plus是Linux系统GNOME桌面环境的工具,方便于在工具栏显示应用小图标. 1.进入GNOME商店搜搜下载TopIcons Plus工具.下载路径:https://extens ...

  10. zk实践操作

    1.入门基础 应用场景 ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理.统一命名服务.分布式锁.集群管理. 使用分布式系统就无法避免对节点管理的问题(需要实时感知节 ...