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

图论---Prim堆优化(稀疏图)

  • 题目通常会提示数据范围

    • 若 V ≤ 500,两种方法均可(朴素Prim更稳)。

    • 若 V ≤ 1e5,必须用优先队列Prim + vector 存图。

#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;const int N = 510, INF = 0x3f3f3f3f;
typedef pair<int, int> PII; // (distance, node)int n, m;
vector<PII> adj[N]; // 邻接表
int dist[N];        // 存储各点到生成树的最小距离
bool st[N];         // 标记是否已加入生成树int prim() {memset(dist, 0x3f, sizeof dist);priority_queue<PII, vector<PII>, greater<PII>> heap; // 小根堆heap.push({0, 1}); // 从节点 1 开始dist[1] = 0;int res = 0, cnt = 0; // cnt 记录已加入生成树的节点数while (!heap.empty()) {auto [d, u] = heap.top();heap.pop();if (st[u]) continue; // 已加入生成树,跳过st[u] = true;res += d;cnt++;// 遍历 u 的所有邻边for (auto [v, w] : adj[u]) {if (!st[v] && w < dist[v]) {dist[v] = w;heap.push({dist[v], v});}}}return cnt == n ? res : INF; // 如果生成树包含所有节点,返回总权重;否则返回 INF
}int main() {cin >> n >> m;while (m--) {int a, b, c;cin >> a >> b >> c;adj[a].push_back({b, c});adj[b].push_back({a, c}); // 无向图}int t = prim();if (t == INF) puts("impossible");else cout << t << endl;return 0;
}

相关文章:

  • Selenium 怎么加入代理IP,以及怎么检测爬虫运行的时候,是否用了代理IP?
  • 报错_NoSuchMethodException: cn.mvc.entity.User.<init>()
  • 多线程中的ABA问题详解
  • Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理
  • 27-算法打卡-字符串-找出字符串中第一个匹配项的下标-leetcode(28)-第二十七天
  • 16.磁环在EMC设计中的选型与运用
  • 如何将极狐GitLab 议题导出为 CSV?
  • 【数据结构】_树和二叉树
  • 数据结构算法复杂度介绍
  • uniapp-商城-34-shop 购物车 选好了 进行订单确认
  • SQLMesh 模型选择指南:优化大型项目的模型更新
  • 学习记录:DAY17
  • 第17章:MCP框架构建知识工作助手
  • 【GO语言小案例手记】基于GIN的简易代理网关
  • SQL实战:02之连续数问题求解
  • 基于单片机的游泳馆智能管理系统
  • 借助deepseek和vba编程实现一张表格数据转移到多张工作簿的表格中
  • LVGL在VScode的WSL2中仿真
  • Linux之安装配置Nginx
  • Redis--预备知识以及String类型
  • 人民日报钟声:中方维护自身发展利益的决心不会改变
  • 上海营商环境的“分寸”感:底线之上不断拓宽自由,底线之下雷霆制止
  • 一网红被指涉脱衣殴打霸凌事件,沈阳警方:刑拘1人,处罚5人
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调:深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导
  • 市场监管总局通报民用“三表”专项检查结果
  • 立夏的野火饭