当前位置: 首页 > 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类型
  • 5月2日,全社会跨区域人员流动量完成29275.4万人次
  • 国内锂矿“双雄”开局业绩PK:从巨亏中崛起,或深陷泥淖谋求多元转型
  • 缔造“水饺皇后”的香港,也是被移民塑造的香港
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 美国务院宣布新一轮与伊朗相关的制裁
  • 全国台联原会长杨国庆逝世,享年89岁