当前位置:网站首页>图论之Prim,最小生成树该怎么解?
图论之Prim,最小生成树该怎么解?
2022-08-02 12:49:00 【sheep.ice】
一、前言
此篇主要针对图论中的求最小生成树的一种算法Prim算法,这个算法其实整体的结构和dijkstra算法是相似的,所以整体的思路也和dijkstra算法有异曲同工之妙。首先,讲一下自己对最小生成树这个概念的理解。
生成树:
包含图中所有结点,且整个结点形成的一张图中不含有任何环,一旦再多连接两个结点形成一条边,一定会生成一个环的一个结构图。
最小生成树:
在一个图中找到的所有生成树中,所有边加起来的权值最小的那一棵生成树是一颗最小生成树。
二、题目汇总
①Prim算法模板(ACwing.858)
时间复杂度:
O ( n 2 ) O(n^2) O(n2)
适用场景:
点数少,边数多的最小生成树求解。
思路:
和dijkstra算法结构差不多,但是此时定义的dist数组指的是,此时计算的某个点,到我们此时求到的生成树整个集合中的一个最小值距离。也就是说我们在推导dist数组的时候,同样每次选取一个距离集合最短的那一条边进行一个延申,不断延申的时候求出某个点到整个已经求出的部分最小生成树的一个距离最小值。
更新过程:
紫色
当前利用的更新点
蓝色
当前更新完后,某个点距离整个集合的最小距离
红色
两个结点边的长度
上图最终的最小生成树就为3!
完整AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 505, INF = 0x3f3f3f3f;
int g[N][N], dist[N];
bool st[N];
int n, m;
int prim() {
int res = 0;
dist[1] = 0;
for(int i = 1; i <= n; i ++ ) {
int t = -1;
//寻找离集合最近的那一条边
for(int j = 1; j <= n; j ++ ) {
if(!st[j] && (t == -1 || dist[j] < dist[t])) {
t = j;
}
}
//如果dist[t] = INF代表没有边连向集合,直接返回
if(dist[t] == INF) return INF;
st[t] = true;
for(int j = 1; j <= n; j ++ ) {
dist[j] = min(dist[j], g[t][j]);
}
res += dist[t];
}
return res;
}
int main() {
memset(dist, 0x3f, sizeof(dist));
memset(st, 0, sizeof st);
memset(g, 0x3f, sizeof g);
cin >> n >> m;
for(int i = 1; i <= m; i ++ ) {
int a, b, c;
cin >> a >> b >> c;
//先去掉自环
//注意这种都是无向图,所以两个边都需要赋值
if(a != b) g[a][b] = g[b][a] = min(g[a][b], c);
}
int ans = prim();
if(ans == INF) cout << "impossible" << endl;
else cout << ans << endl;
return 0;
}
边栏推荐
猜你喜欢
汉源高科千兆12光12电管理型工业以太网交换机 12千兆光12千兆电口宽温环网交换机
Import and export data of SQL Server database
自定义mvc框架复习
ssm访问数据库数据报错
数据湖(三):Hudi概念术语
Object.entries()
FreeRTOS experiment--one function creates multiple tasks
php——三篇夯实根基第一篇
np.nan, np.isnan, None, pd.isnull, pd.isna finishing and summary
FreeRTOS--Priority Experiment
随机推荐
机器人碰撞检测方法形式化
自定义mvc框架复习
zabbix automated monitoring script
pgsql数据库实现导入导出
分布式限流利器,手撕&redisson实现
LeetCode_139_word split
String concatenation in SQL
SQL Server修改数据
SQL Server database generation and execution of SQL scripts
js true 3d histogram plugin
FreeRTOS--Priority Experiment
ETL(二):表达式组件的使用
新特性解读 | MySQL 8.0 GIPK 不可见主键
MFC入门教程(深入浅出MFC)
How to better assess credit risk?Just watch this scorecard model live
package.json and package-lock.json
PGSQL database to realize the import and export
How to turn off hardware acceleration [easy to understand]
手撸架构,Mysql 面试126问
js源码跳转的几种方式,在当前页面跳转,在空白页跳转