博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF609E]Minimum spanning tree for each edge
阅读量:5797 次
发布时间:2019-06-18

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

题目大意:有一张$n$个点$m$条边的图,要求对于每条边求出包含这条边的最小生成树

题解:先求出最小生成树,发现加入一条不在最小生成树上的边,就会出现一个环,那么把这个环上除这条边外权值最大的一条边删去就是对于这条边的最小生成树,可以倍增求

卡点:倍增结尾处理错

 

C++ Code:

#include 
#include
#define maxn 200010int head[maxn], cnt;struct Edge { int to, nxt, w;} e[maxn << 1];inline void add(int a, int b, int c) { e[++cnt] = (Edge) {b, head[a], c}; head[a] = cnt; e[++cnt] = (Edge) {a, head[b], c}; head[b] = cnt;}int l[maxn], r[maxn], w[maxn], rnk[maxn];bool yes[maxn];inline bool cmp(int a, int b) {return w[a] < w[b];}int f[maxn];int find(int x) {return (x == f[x] ? x : (f[x] = find(f[x])));}int n, m;long long ans;#define M 18int fa[M][maxn], S[M][maxn], dep[maxn];inline int max(int a, int b) {return a > b ? a : b;}void dfs(int u) { for (int i = 1; i < M; i++) { fa[i][u] = fa[i - 1][fa[i - 1][u]]; S[i][u] = max(S[i - 1][u], S[i - 1][fa[i - 1][u]]); } for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (v != fa[0][u]) { fa[0][v] = u; dep[v] = dep[u] + 1; S[0][v] = e[i].w; dfs(v); } }}inline ask(int x, int y) { int res = 0; if (dep[x] < dep[y]) std::swap(x, y); for (int i = dep[x] - dep[y]; i; i &= i - 1) res = max(res, S[__builtin_ctz(i)][x]), x = fa[__builtin_ctz(i)][x]; if (x == y) return res; for (int i = M - 1; ~i; i--) if (fa[i][x] != fa[i][y]) { res = max(res, max(S[i][x], S[i][y])); x = fa[i][x], y = fa[i][y]; } return max(res, max(S[0][x], S[0][y]));}int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d%d", l + i, r + i, w + i); rnk[i] = i; } for (int i = 1; i <= n; i++) f[i] = i; std::sort(rnk, rnk + m, cmp); for (int j = 0, i, lastnum = n - 1; j < m && lastnum; j++) { i = rnk[j]; int u = find(l[i]), v = find(r[i]); if (u != v) { add(l[i], r[i], w[i]); yes[i] = true; f[u] = v; lastnum--; ans += w[i]; } } dep[1] = 1; dfs(1); for (int i = 0; i < m; i++) { if (yes[i]) printf("%lld\n", ans); else printf("%lld\n", ans - ask(l[i], r[i]) + w[i]); } return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9762235.html

你可能感兴趣的文章
P2P行业专业术语(最全)
查看>>
C#中的Marshal
查看>>
网站发的文章有收录 但是没有排名怎么处理
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
shell编程笔记六:实现ll命令
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
[nodejs] nodejs开发个人博客(五)分配数据
查看>>
《Linux内核修炼之道》 之 高效学习Linux内核
查看>>
Java数据持久层框架 MyBatis之API学习九(SQL语句构建器详解)
查看>>
30分钟Git命令“从入门到放弃”
查看>>
nginx : TCP代理和负载均衡的stream模块
查看>>
MYSQL数据库间同步数据
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
行为型模式:观察者模式
查看>>
让前端小姐姐愉快地开发表单
查看>>
Dubbo笔记(四)
查看>>
Web前端JQuery入门实战案例
查看>>