EVERYTHING HAPPENS FOR THE BEST!|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-10-08 11:48阅读: 38评论: 0推荐: 0

最小生成树和次小生成树

OI-wiki Link

最小生成树,就是图上边权和最小的生成树。

n 为图上节点数,m 为图的边数。

Kruskal

克鲁斯卡尔算法,一种常见且方便好写的最小生成树算法,利用贪心的思想+并查集维护。

贪心就是按边权从小到大排序,依次处理。如果当前边的两个端点处于同一棵树内,那么就不能加这条边(否则会形成环,不满足生成树的要求),否则将这条边连起来。

判断两点是否处于同一棵树内,这不就是并查集所维护的吗?

排序:O(mlogm),并查集就看写的是什么了。空间复杂度:O(n+m)

Prim

Prim 是另外一种常见且码量也不算很多的最小生成树算法,主要思想就是维护每个点到生成树内的点的最短距离,每次把距离最小的加入最小生成树。

加入距离最小的点,可以通过暴力查找,也可以用优先队列维护,但它复杂度并没有更优,常数也比 Kruskal 要大,所以一般非必要情况下不会写 Prim。

  • 暴力の优势:O(n2+m) 的复杂度,对于稠密图来说较为占便宜,例。
  • 优化の优势:O(mlogm) 的复杂度,对于稀疏图来说比较优秀,挺常见。

次小生成树

非严格次小生成树

令图的最小生成树为 T,那么对于每条非树边 (u,v,w),找到 Tuv 路径上的边权最大的一条边,把它删掉,再加入 (u,v,w),就可以得到一棵新的生成树,取这些新的生成树中边权之和最小的即可。

维护 u,v 路径上的边权最大值也很简单,首先预处理,然后每次倍增 LCA 即可。

严格次小生成树

观察原本的算法,为啥它是非严格的呢?因为可能这条路径上的最大值恰好等于 w,此时边权之和没有改变,所以是非严格的。

解决方法也很简单,只要在维护最大值时顺便维护一个严格次大值,当最大值等于 w 时则用严格次大值来替换。

细节不少,D 了我至少一个小时。

struct MST {
vector<pair<int, int>> g[N];
int fa[N][25], mx[N][25][2], h[N];
void Add (int x, int y, int z) {
g[x].push_back({y, z}), g[y].push_back({x, z});
}
void MkTe (int x) {
h[x]++;
for (auto i : g[x]) {
if (i.first != fa[x][0]) {
fa[i.first][0] = x, mx[i.first][0][0] = i.second, mx[i.first][0][1] = -1, h[i.first] = h[x], MkTe(i.first);
}
}
}
void FAT () {
for (int i = 0; i <= 20; i++) {
mx[0][i][0] = mx[0][i][1] = -1;
}
for (int i = 1; i <= 20; i++) {
for (int j = 1; j <= n; j++) {
fa[j][i] = fa[fa[j][i - 1]][i - 1], mx[j][i][0] = mx[j][i - 1][0], mx[j][i][1] = mx[j][i - 1][1];
if (mx[fa[j][i - 1]][i - 1][0] > mx[j][i][0]) {
mx[j][i][1] = mx[j][i][0], mx[j][i][0] = mx[fa[j][i - 1]][i - 1][0];
} else if (mx[fa[j][i - 1]][i - 1][0] < mx[j][i][0] && mx[fa[j][i - 1]][i - 1][0] > mx[j][i][1]) {
mx[j][i][1] = mx[fa[j][i - 1]][i - 1][0];
}
if (mx[fa[j][i - 1]][i - 1][1] < mx[j][i][0] && mx[fa[j][i - 1]][i - 1][1] > mx[j][i][1]) {
mx[j][i][1] = mx[fa[j][i - 1]][i - 1][1];
}
}
}
}
pair<int, int> lca (int x, int y) {
if (h[x] > h[y]) {
swap(x, y);
}
pair<int, int> xm = {-1, -1};
for (int i = 20; i >= 0; i--) {
if ((h[y] - h[x]) >> i) {
if (mx[y][i][0] > xm.first) {
xm.second = xm.first, xm.first = mx[y][i][0];
} else if (mx[y][i][0] < xm.first && mx[y][i][0] > xm.second) {
xm.second = mx[y][i][0];
}
if (mx[y][i][1] < xm.first && mx[y][i][1] > xm.second) {
xm.second = mx[y][i][1];
}
y = fa[y][i];
}
}
if (x == y) {
return xm;
}
for (int i = 20; i >= 0; i--) {
if (fa[x][i] != fa[y][i]) {
if (mx[y][i][0] > xm.first) {
xm.second = xm.first, xm.first = mx[y][i][0];
} else if (mx[y][i][0] < xm.first && mx[y][i][0] > xm.second) {
xm.second = mx[y][i][0];
}
if (mx[y][i][1] < xm.first && mx[y][i][1] > xm.second) {
xm.second = mx[y][i][1];
}
if (mx[x][i][0] > xm.first) {
xm.second = xm.first, xm.first = mx[x][i][0];
} else if (mx[x][i][0] < xm.first && mx[x][i][0] > xm.second) {
xm.second = mx[x][i][0];
}
if (mx[x][i][1] < xm.first && mx[x][i][1] > xm.second) {
xm.second = mx[x][i][1];
}
y = fa[y][i], x = fa[x][i];
}
}
if (mx[y][0][0] > xm.first) {
xm.second = xm.first, xm.first = mx[y][0][0];
} else if (mx[y][0][0] < xm.first && mx[y][0][0] > xm.second) {
xm.second = mx[y][0][0];
}
if (mx[y][0][1] < xm.first && mx[y][0][1] > xm.second) {
xm.second = mx[y][0][1];
}
if (mx[x][0][0] > xm.first) {
xm.second = xm.first, xm.first = mx[x][0][0];
} else if (mx[x][0][0] < xm.first && mx[x][0][0] > xm.second) {
xm.second = mx[x][0][0];
}
if (mx[x][0][1] < xm.first && mx[x][0][1] > xm.second) {
xm.second = mx[x][0][1];
}
return xm;
}
} mst;

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/spanning_tree.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(38)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 - 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 一殇/白祺/苏少安/苏栗无/公子无央/白刃昏鸦/非欢/清茗/未及昭声/汀帆/赵艹地

作曲 : 沐若

心机之蛙,一直摸你肚子

——《名侦探柯南》原创同人曲

策划:炊饭

作曲:沐若

作词:一殇、白祺、苏少安、苏栗无、公子无央、白刃昏鸦、非欢、清茗、未及昭声、汀帆、赵艹地

编曲:斓音音乐实验室

演唱:叶辞樱、温海、寒砧、南柯、小茜玛姬、墨催、阿崔Ac、贝壳初、千湛、兮茶子、乔慕、黎鹿北、起千温卿、遮阳伞、曲悠

后期:幽谷

题字/美工:徒夫

监制:楠烛

【角色-词作-歌手】

【铃木园子-一殇-叶辞樱】

没有绝对杀机

爱恨调转 对错是唯一

【赤井秀一-白祺-温海】

枪膛里银色子弹

最后的致命一击

-

【毛利小五郎-苏少安-寒砧】

沉睡倒看真相 别小瞧绅士

叼烟来探 糊涂作势

【妃英理-白祺-南柯】

剥离出实情

透过谎言再续 不败传奇

-

【苏栗无-樱/砧/海/柯】

迷茫中看见吗 向谁的真谛

让谁的眼泪 都变成迷离

罪的答案是你 路的尽头是你

-

【怪盗基德-公子无央-小茜玛姬】

Kaitou 这雪白的谜语 将帽檐压低

以滑翔翼敬礼 向手铐和你

【服部平次-白刃昏鸦-墨催】

爱与真相是唯一

十字路口 迷宫的暗语

-

【灰原哀-非欢-乔慕】

回到少年时期 退化至逃离

像天才的过去 深海的鲨鱼

【毛利兰-非欢-起千温卿】

害怕妖怪和雷雨

正义和你 是我的勇气

-

【清茗-姬/催/慕/卿/悠】

天才与罪犯在探试 我已锁定案件起始

黑暗中蛰伏无休止 被贪欲吞噬

黄昏时 布谷钟请柬送至

跋涉深渊之池 侦探们的镇魂诗

-

【目暮十三-一殇-阿崔Ac】

樱花之名起誓

追寻真相 对罪恶通缉

【阿笠博士-苏少安-贝壳初】

古怪是科学正义

热衷将永不歇止

-

【安室透-白刃昏鸦-千湛】

被隐去的名姓 真伪皆归零

谜面重启 逆向独行

【琴酒-未及昭声-兮茶子】

用死亡美学 虔诚将你献祭

无声狙击

-

【汀帆-崔/初/湛/茶】

拨开重重迷题 信仰即期许

平扫僵阵地 守一方境域

且看如何踏破 早已残废终局

-

【江户川柯南-未及昭声-黎鹿北】

真相 折射在那镜片 透视在眼底

借时间逆行 拆穿真凶伏笔

【工藤新一-公子无央-遮阳伞】

骄傲是天才之理

逐一剖析 黑色的缝隙

-

【赵艹地-鹿/伞】

转动命运齿轮 去超越世纪

继续探查疑案 来解开谜题

【贝尔摩德-赵艹地-曲悠】

最喜爱伪装神秘

卷入迷雾 从容扣动扳机

-终-

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示