博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Luogu P4716 【模板】最小树形图
阅读量:6834 次
发布时间:2019-06-26

本文共 1940 字,大约阅读时间需要 6 分钟。

不知道有什么用的一个东西。本来不打算再大量扩知识点了但还是学一下好了,反正也不难。

原理:树上父亲唯一,每次选最短的父边。

此时会有两类情况:

  • 就这样正常连下去,这样我们就得到了一个尽可能小的树形图。

  • 成环。这种情况下我们需要拆掉环里的一条边换成其他的边。

我们记录一下到达每个点的最短父边权值是多少。对于成环的情况,可以先把环里面所有边的权值选上,把环里面的所有点看成一个。然后等到有其它外来的边连进来的时候,再选一个最小的外来边,去掉环里面原先所暂时使用的边,换成外来的那个,就这样一直求解直到不再有环。

#include 
using namespace std;typedef long long ll;const int N = 100 + 5;const int M = 10000 + 5;const ll INF = 0x3f3f3f3f;int n, m, r;struct edge {int u, v, w;} e[M];int fa[N], id[N], top[N], minw[N];ll get_ans (int n, int m) { ll ans = 0; while (true) { int cnt = 0; for (int i = 1; i <= n; ++i) { id[i] = top[i] = 0; minw[i] = INF; } for (int i = 0; i < m; ++i) { if (e[i].u != e[i].v && e[i].w < minw[e[i].v]) { fa[e[i].v] = e[i].u; minw[e[i].v] = e[i].w; } } minw[r] = 0; for (int i = 1; i <= n; ++i) { if (minw[i] == INF) return -1; ans += minw[i]; int u = i; while (u != r && top[u] != i && !id[u]) { top[u] = i; u = fa[u]; } if (u != r && !id[u]) { id[u] = ++cnt; for (int v = fa[u]; v != u; v = fa[v]) id[v] = cnt; } } if (cnt == 0) return ans; for (int i = 1; i <= n; ++i) { if (!id[i]) id[i] = ++cnt; } for (int i = 0; i < m; ++i) { int prew = minw[e[i].v]; e[i].u = id[e[i].u]; e[i].v = id[e[i].v]; if (e[i].u != e[i].v) { e[i].w -= prew; } } n = cnt; r = id[r]; }}int main () { cin >> n >> m >> r; for (int i = 0; i < m; ++i) { static int u, v, w; cin >> u >> v >> w; e[i] = (edge) {u, v, w}; } cout << get_ans (n, m) << endl;}

以及非常感谢 @旋转卡壳 的代码。仅仅是读注释就可以快速理解整个算法的流程。(虽然代码不加空格\(www\)

转载于:https://www.cnblogs.com/maomao9173/p/10780452.html

你可能感兴趣的文章
猛醒:也许我们一生追求的都错了!
查看>>
IDDD 实现领域驱动设计-理解领域和子域
查看>>
GitHub基本操作
查看>>
微信开发(01)之如何成为开发者
查看>>
Redis 中的事务
查看>>
canvas使用3
查看>>
怎么创建MongoDB数据库
查看>>
Quart2D图形上下文
查看>>
html5 canvas旋转+缩放
查看>>
QtGui.QSplitter
查看>>
前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯...
查看>>
ODAC(V9.5.15) 学习笔记(十九)主键值自动生成
查看>>
MVC4 WebApi开发中如果想支持Session请做好如下几个方面的问题
查看>>
Android中View绘制流程以及invalidate()等相关方法分析
查看>>
nicehair
查看>>
Hibernate工作原理
查看>>
《双龍形态操盘秘笈》
查看>>
怎样查看apk须要支持的Android版本号
查看>>
各种机械键盘轴线之间的差究竟好轴
查看>>
攻略三战的完美体验3Castle Fantisia阿兰·梅希亚战争艾伦西战记它包含重做版本(这是新的艾伦·梅希亚大战)...
查看>>