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

最短路径树(SPT问题)

最短路径树(SPT问题)

定义:在一张无向带权联通图中,有这样一棵生成树:满足从根节点到任意点的路径都为原图中根到任意点的最短路径。

性质:记根节点 \(Root\) 到某一结点 \(x\) 的最短距离 \(dis_{Root,x}\) ,在 \(SPT\) 上这两点之间的距离为 \(len_{Root,x}\) ——则两者长度相等。

该算法与最小生成树无关,基于最短路 \(\tt Djikstra\) 算法完成(但多了个等于号)。下方代码实现的功能为:读入图后,输出以 \(1\) 为根的 \(\tt SPT\) 所使用的各条边的编号、边权和。

map<pair<int, int>, int> id;
namespace G {vector<pair<int, int> > ver[N];map<pair<int, int>, int> edge;int v[N], d[N], pre[N], vis[N];int ans = 0;void add(int x, int y, int w) {ver[x].push_back({y, w});edge[{x, y}] = edge[{y, x}] = w;}void djikstra(int s) { // !注意,该 djikstra 并非原版,多加了一个等于号priority_queue<PII, vector<PII>, greater<PII> > q; q.push({0, s});memset(d, 0x3f, sizeof d); d[s] = 0;while (!q.empty()) {int x = q.top().second; q.pop();if (v[x]) continue; v[x] = 1;for (auto [y, w] : ver[x]) {if (d[y] >= d[x] + w) { // !注意,SPT 这里修改为>=号d[y] = d[x] + w;pre[y] = x; // 记录前驱结点q.push({d[y], y});}}}}void dfs(int x) {vis[x] = 1;for (auto [y, w] : ver[x]) {if (vis[y]) continue;if (pre[y] == x) {cout << id[{x, y}] << " "; // 输出SPT所使用的边编号ans += edge[{x, y}];dfs(y);}}}void solve(int n) {djikstra(1); // 以 1 为根dfs(1); // 以 1 为根cout << endl << ans; // 输出SPT的边权和}
}
bool Solve() {int n, m; cin >> n >> m;for (int i = 1; i <= m; ++ i) {int x, y, w; cin >> x >> y >> w;G::add(x, y, w), G::add(y, x, w);id[{x, y}] = id[{y, x}] = i;}G::solve(n);return 0;
}
http://www.jsqmd.com/news/21176/

相关文章:

  • 欧拉路径/欧拉回路 Hierholzers
  • 无源汇点的最小割问题 Stoer–Wagner
  • 染色法判定二分图 (dfs算法)
  • 链式前向星建图与搜索
  • 一般图最大匹配
  • CF2152G
  • 缩点(Tarjan 算法)
  • 平面图最短路(对偶图)
  • 多源汇最短路(APSP问题)
  • 最小生成树(MST问题)
  • 常见概念
  • 单源最短路径(SSSP问题)
  • CNCF项目记录2025-10
  • 代理
  • 双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?
  • 树上路径交
  • 10.23总结
  • 关于 vue项目 代理的坑;baseURL必须为空;代理才会生效
  • 点分治 / 树的重心
  • 10.21总结
  • 最近公共祖先 LCA
  • 题解:P3343 [ZJOI2015] 地震后的幻想乡
  • 暂存:P14214 [COI 2010] 圆圈 / KOLO
  • 树论大封装(直径+重心+中心)
  • QMPlayer2解析
  • 2025年10月广州单位办公室搬家公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 书评-谋杀黄昏
  • 徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估
  • 完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用
  • 附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名