最小生成树学习笔记
https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91
https://zh.wikipedia.org/wiki/%E6%99%AE%E6%9E%97%E5%A7%86%E7%AE%97%E6%B3%95
注意时间复杂度
模板TBD
Posted 朝气蓬勃 后生可畏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「学习笔记」重修生成树相关的知识,希望对你有一定的参考价值。
最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树。
将所有的边按边权从小到大排序,然后用并查集维护一条边所连接的两个点是否已联通(不能形成环)。
int find(int x)
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
ll kruskal()
ll tot = 0, cot = 0;
sort(e + 1, e + m + 1);
for (int i = 1; i <= n; ++ i)
fa[i] = i;
for (int i = 1; i <= m; ++ i)
int x = e[i].u, y = e[i].v;
int fx = find(x), fy = find(y);
if (fx != fy)
fa[fx] = fy;
tot += e[i].w;
++ cot;
if (cot >= n - 1) return tot;
return 0;
原理与 dijkstra 是一样的,都是用了贪心的思想。
dis[v]
连向 \\(v\\) 点的最小生成树的边的边长。
void prim()
priority_queue<pil, vector<pil>, greater<pil> > q;
q.push(make_pair(0, 1));
while (!q.empty())
int u = q.top().second;
q.pop();
if (vis[u]) continue;
++ cnt;
tot += dis[u];
vis[u] = 1;
if (cnt >= n) return ;
for (auto it : son[u])
int v = it.first, w = it.second;
if (dis[v] > w)
dis[v] = w;
q.push(make_pair(dis[v], v));
https://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91
https://zh.wikipedia.org/wiki/%E6%99%AE%E6%9E%97%E5%A7%86%E7%AE%97%E6%B3%95
注意时间复杂度
模板TBD
以上是关于「学习笔记」重修生成树的主要内容,如果未能解决你的问题,请参考以下文章