首页 > 其他分享 >最小生成树

最小生成树

时间:2023-04-21 13:58:10浏览次数:41  
标签:ch int text 最小 生成 Kruscal

前言

最小生成树是图论的一种,生成树问题研究的就是把图里面所有顶点保留,但只会选择部分边所得到的树。

分析

P3366 【模板】最小生成树

\(\text{Kruscal 算法}\)

\(\text{Kruscal}\) 是利用并查集实现的算法,适合用于稀疏图,它的时间复杂度为 \(O(m\log m)\)(\(m\) 为边数),具体实现过程如下:

  1. 将所有边从小到大排序;
  2. 每个点分配并查集;
  3. 选择未使用的边中的边权最小的,如果这条边连接的两个点已未联通,合并并查集;
  4. 不断去选择,直到所有点均被使用或者未使用的点没有任何连边。

\(\text{Prim 算法}\)

这种算法时间复杂度不如 \(\text{Kruscal}\) 优秀,仅有 \(O(n^2 + m)\),只有加上堆优化才能拥有较优秀的复杂度,为 \(O(m \log m)\),它的具体实现方式与最短路中 \(\text{Dijkstra}\) 相同,感兴趣的读者可以尝试自己去实现。其实是不想写这玩意。

Code

那么,现在给出 \(\text{Kruscal}\) 的代码。
AC Code of P3366 【模板】最小生成树

#include <bits/stdc++.h>

#define int long long
//#pragma G++ optimize(2) 

using namespace std;

const int N = 2e5 + 10;

int n,m,id = 0;
struct node {
	int x,y,val;
} a[N];
int f[N],res = 0;

inline int read() {
	int x = 0,f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - 48;
		ch = getchar();
	}
	return x * f;
}

bool cmp(node a,node b) {
	return a.val < b.val;
}


int find(int x) {
	if (f[x] == x) return x;
	return find(f[x]);
}

void kruscal() {
	for (int i = 1; i <= n; ++ i ) f[i] = i;
	sort(a + 1,a + m + 1,cmp);
	int wc = 0;
	for (int i = 1; i <= m; ++ i ) {
		int x = a[i].x,y = a[i].y,val = a[i].val;
		if (find(x) == find(y)) continue;
		f[find(x)] = find(y);
		res += val;
		++ wc;
		if (wc == n - 1) break;
	}
	if (wc == n - 1) cout << res << endl;
	else cout << "orz" << endl;
}

signed main() {
	n = read(); m = read();
	for (int i = 1; i <= m; ++ i ) a[i].x = read(),a[i].y = read(),a[i].val = read();
	kruscal();
	return 0;
}

推荐习题

下面给出一些习题,建议读者自己去尝试做一做。

P1546 [USACO3.1]最短网络 Agri-Net

P2872 [USACO07DEC]Building Roads S

P2330 [SCOI2005]繁忙的都市

P1194 买礼物

P1265 公路修建

\(\text{作者:songszh}\)

\[\text{Thanks} \]

标签:ch,int,text,最小,生成,Kruscal
From: https://www.cnblogs.com/songszh/p/zui-xiao-sheng-cheng-shu.html

相关文章

  • 51nod 1212 无向图最小生成树(最小生成树)
    1212 无向图最小生成树基准时间限制:1 秒空间限制:131072 KB分值: 0 难度:基础题 收藏 关注Input第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)第2 - M + 1行:每行......
  • jmeter生成html测试报告(二)
    利用jmeter自带工具:GenerateHTMLreport生成html测试报告:1、打开jmeter测试工具,选择Tools,选择GenerateHTMLreport; 2、完善生成生成报告所需要的内容: 3、点击生成即可 4、根据导出报告的目录即可找到html测试报告了  ......
  • jmeter生成html测试报告(一)
    jmeter如何生成好看且直观的测试报告,可以利用代码生成,也可以利用jmeter自带的工具生成,下面一起了解一下吧!1、首先我们在.jmx文的目录通过cmd进入到dos命令窗口; 2、输入生成报告的代码:jmeter-n-ttest/zhujianwei.jmx-lresult.jtl-e-operformanceReport/#-n:以非GU......
  • 最小生成树详解-模板
    概念最小生成树的定义在一张带权无向图中,最小生成树是一棵生成树,它的边权值之和最小。生成树是一颗包含原图中所有顶点的树,它的边集合是原图的一个子集,且任意两个顶点之间都有且仅有一条简单路径。最小生成树的算法目前,最常用的两种最小生成树算法是Kruskal算法和Prim算法。Kruska......
  • 【Spring】@Configuration为什么会生成代理呢?
    1 前言首先说下为什么会产生这样的疑惑哈,最近在看Spring-retry的时候,发现:其次我们再来看个现象,@Component声明了一个Bean,内部有个单例AService,当我们调用两次 aService()发现得到的对象不一样:@ComponentpublicclassDemo{publicclassAService{publ......
  • LeetCode 22 括号生成
    LeetCode|22.括号生成数字n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例1:输入:n=3输出:["((()))","(()())","(())()","()(())","()()()"]示例2:输入:n=1输出:["()"]提示:1<=n<=8方案一:递归  当......
  • C#中的分布式ID生成组件IDGen介绍并给出示例代码
    C#中的IDGen是一个C#实现的TwitterSnowflake算法的ID生成器,可以生成全局唯一的ID,支持高并发场景下的ID生成。在本篇文章中,我们将介绍IDGen的使用方法并提供相关的C#示例代码。IDGen的介绍IDGen是一款开源的分布式唯一ID生成器,支持多种ID生成算法,并且可以在高并发场景下快速生成......
  • 畅通工程之局部最小花费问题 - 最小生成树
    某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建快速路的费用,以及该道路......
  • Building a Space Station 2031 (三维的 最小生成树 prim)
    BuildingaSpaceStationTimeLimit:1000MS MemoryLimit:30000KTotalSubmissions:5873 Accepted:2913DescriptionYouareamemberofthespacestationengineeringteam,andareassignedataskintheconstructionprocessofthestation.Youareexpec......
  • Permutation Restoration (贪心,排序处理) (范围左端点排序,然后取最小点放)
     思路:对于每一个bi都会有有一个范围,然后贪心的做,具体的先对这个范围按照左端点排序,然后贪心的去最小的值去放 ......