\(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. installshield 安装jdk并配置环境变量

    今天来通过installshield安装jdk以及配置环境变量,本质上是调用第三方安装程序. 首先将jdk的安装文件添加到我们的安装程序中 然后编写我们的脚本 选择BEHAVIOR AND LOGIC ...

  2. AIRIOT物联网低代码平台如何配置http客户端?

    AIRIOT物联网低代码平台一直保持和市场脉搏同频,支持市面上95%以上驱动,驱动能力夯实,大大满足任意数据采集需求.AIRIOT支持分布式部署,数据采集能力强,解决海量数据采集一台服务器采集困难的问 ...

  3. Python重试任务模块tenacity

    软硬件环境 windows 11 64bits python 3.6 tenacity 简介 在实际应用中,经常会碰到在web请求时,因为网络的不稳定,会有请求超时的问题,这时候,一般都是自己去实现重 ...

  4. Python:用Pandas输出格式化HTML并高亮

    输出格式化的HTML 我们已知一个DataFrame记录了模型Model1.Model2在3个Epoch优化中的精度变化情况: frame = pd.DataFrame({"Model1&q ...

  5. WPF登录界面样例

    XAML文件内容如下 1 <Window x:Class="ERP.Views.Login" 2 xmlns="http://schemas.microsoft.c ...

  6. 『手撕Vue-CLI』处理不同指令

    前言 在上一篇『手撕Vue-CLI』添加自定义指令中,已经实现了自定义指令的添加,但是指令还是比较简单的,只是简单的打印一句话,那么在实际运用场景中,可能会有更多的需求,比如可能需要在指令中传递参数, ...

  7. 如何启动?win11下的Linux子系统【4种方法】

    实验室的开发环境在Linux操作系统下,时不时就需要打开Linux环境去操作,而且需要本地编译或者远程SSH.这时候window和Linux切换很不方便.本科的做法就是window+虚拟机的Linux ...

  8. Linux下docker安装部署

    Linux下docker安装部署 环境说明 该文档安装环境为CentOS Linux release 7.9.2009,内核版本为3.10.0-1160.81.1.el7.x86_64 安装说明 安装 ...

  9. idea mapper xml 文件报红

    在使用 idea 打开 mapper 文件,出现一下报红错误: 可以看到数据表和字段都是红色的. 解决方案 打开设置,window版本是打开Settings: 找到 Languages & F ...

  10. B站login-极验逆向

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 https:// ...