当前位置: 首页 > news >正文

题解:AcWing 858 Prim算法求最小生成树

【题目来源】

AcWing:858. Prim算法求最小生成树 - AcWing题库

【题目描述】

给定一个 \(n\) 个点 \(m\) 条边的无向图,图中可能存在重边和自环,边权可能为负数。

求最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

给定一张边带权的无向图 \(G=(V,E)\),其中 \(V\) 表示图中点的集合,\(E\) 表示图中边的集合,\(n=|V|\)\(m=|E|\)

\(V\) 中的全部 \(n\) 个顶点和 \(E\)\(n-1\) 条边构成的无向连通子图被称为 \(G\) 的一棵生成树,其中边的权值之和最小的生成树被称为无向图 \(G\) 的最小生成树。

【输入】

第一行包含两个整数 \(n\)\(m\)

接下来 \(m\) 行,每行包含三个整数 \(u,v,w\),表示点 \(u\) 和点 \(v\) 之间存在一条权值为 \(w\) 的边。

【输出】

共一行,若存在最小生成树,则输出一个整数,表示最小生成树的树边权重之和,如果最小生成树不存在则输出 impossible

【输入样例】

4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4

【输出样例】

6

【解题思路】

image

【算法标签】

《AcWing 858 Prim算法求最小生成树》 #最小生成树# #Prim#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 510;        // 最大节点数
const int INF = 0x3f3f3f3f; // 无穷大值int n;                     // 节点数量
int m;                     // 边数量
int g[N][N];              // 邻接矩阵存储图
int dist[N];              // 存储当前生成树到各节点的最小距离
bool st[N];               // 标记节点是否已加入最小生成树/*** Prim算法:求解无向连通图的最小生成树* @return 最小生成树的总权重,INF表示图不连通*/
int prim()
{// 初始化距离数组为无穷大memset(dist, 0x3f, sizeof(dist));int res = 0;           // 存储最小生成树的总权重// 循环n次,每次加入一个节点到生成树for (int i = 0; i < n; i++){int t = -1;        // 用于记录当前距离最小的节点// 在所有未加入生成树的节点中,找到距离最小的节点for (int j = 1; j <= n; j++){if (!st[j] && (t == -1 || dist[t] > dist[j])){t = j;}}// 如果不是第一个节点(i>0)且最小距离为无穷大,说明图不连通if (i && dist[t] == INF){return INF;    // 图不连通,无法生成最小生成树}// 如果不是第一个节点,将当前边的权重加入总结果if (i){res += dist[t];}// 用新加入的节点t更新其他节点到生成树的最小距离for (int j = 1; j <= n; j++){dist[j] = min(dist[j], g[t][j]);}// 标记节点t已加入最小生成树st[t] = true;}return res;
}int main()
{// 输入节点数和边数scanf("%d%d", &n, &m);// 初始化邻接矩阵为无穷大(表示不可达)memset(g, 0x3f, sizeof(g));// 输入所有边的信息while (m--){int a, b, c;scanf("%d%d%d", &a, &b, &c);// 无向图,双向设置权重,并处理重边(取最小值)g[a][b] = g[b][a] = min(g[a][b], c);}// 调用Prim算法计算最小生成树int t = prim();// 输出结果if (t == INF){// 图不连通,无法生成最小生成树puts("impossible");}else{// 输出最小生成树的总权重printf("%d\n", t);}return 0;
}

【运行结果】

4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4
6
http://www.jsqmd.com/news/399350/

相关文章:

  • 题解:AcWing 852 spfa判断负环
  • 题解:AcWing 851 spfa求最短路
  • 智能指针(三):实现篇 —— shared_ptr 的内部设计与引用计数机制
  • 智能指针(二):机制篇 —— 移动语义与所有权转移
  • 【单片机】vscode环境配置
  • 智能指针(四):体系篇 —— 现代 C++ 内存管理全景图
  • 桌面整理 Desk Tidy
  • 使用 Python + Tkinter 打造“猫狗大战“回合制策略游戏
  • 瑞祥商联卡回收,闲置卡券如何变身“隐形钱包”? - 京顺回收
  • deepspeed训练框架
  • 智能家居AI模型服务化:架构设计最佳实践
  • 《信号与系统》欧拉公式的几何意义与物理学意义:不只是数学,更是宇宙的旋转密码
  • 轴承故障诊断是工业设备监测的重要方向,今天咱们用MATLAB搞个玩具级别的轴承动力学模型。先甩开复杂的数学推导,直接上手写点能跑起来的代码
  • 如何将集体好奇心转化为商业价值
  • [macbookpro] macbook pro m4 关闭开盖就开机的问题
  • 【egui】[特殊字符] 窗口配置小抄:eframe::NativeOptions
  • 从零搭建JumpServer
  • 大数据领域 HBase 的安全机制解析
  • Python全能框架Feapder,四种模式应对复杂场景
  • 大数据领域数据科学的图像识别应用
  • AI原生应用助力决策支持:开启智能决策新时代
  • Flink在实时欺诈检测中的实战应用
  • 修复CVE-2024-20267:Cisco NX-OS中MPLS封装IPv6处理的高危DoS漏洞
  • AI人工智能领域,Stable Diffusion的应用案例
  • Netzwerk von Daten
  • 半结构化数据与数据仓库:集成方案与最佳实践
  • Warum ist Japan seit 1990 gefallen?
  • c# wpf生命周期
  • 基于LSTM神经网络的共享单车需求预测系统设计与实现
  • 环境介绍