[题解] CF609E Minimum spanning tree for each edge
时间:2021-07-20
本文章向大家介绍[题解] CF609E Minimum spanning tree for each edge,主要包括[题解] CF609E Minimum spanning tree for each edge使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
题意
给你 \(n\) 个点, \(m\) 条边,如果对于一个最小生成树中要求必须包括第 \(i(1<=i<=m)\) 条边,那么最小生成树的权值总和最小是多少。
思路
首先求出该图的最小生成树。最小生成树的边的答案就是最小生成树的权值和。记录下来这个权值和,记为 \(ans\) 。
考虑必须包含不在生成树中的边,强行加入了最小生成树对于答案的影响。
就相当于现将这条边加入生成树中,然后再跑 kruskal ,需要找到被并查集查到相同的父亲的那条边,且这条边在最小生成树内。
可以发现,直接在生成树中加入这条边形成的环,都有可能受这条边的影响。
由于按照 kruskal 的思想,边是被排了序的,影响到的边,只有权值最大的一条。
于是可以维护不带修改的树上路径最大值。用LCA或者树剖+ST表/线段树都可以维护。
Code
开了long long 就不会死。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define LL long long
const int MAXN = 2e5 + 5;
struct Edge {
int To, Dis, Next;
};
int head[MAXN], tot = 1;
Edge edge[MAXN << 1];
void Addedge(int u, int v, int w) {
edge[++tot].Next = head[u], edge[tot].To = v, edge[tot].Dis = w, head[u] = tot;
edge[++tot].Next = head[v], edge[tot].To = u, edge[tot].Dis = w, head[v] = tot;
}
struct Edge1 {
int u, v, w, id;
friend bool operator < (Edge1 x, Edge1 y) {
return x.w < y.w;
}
};
Edge1 e[MAXN];
int dp[MAXN][40], maxn[MAXN][40];
int fa[MAXN], dep[MAXN], n, m;
bool flag[MAXN];
LL ans;
int Find(int x) {
return fa[x] == x ? x : (fa[x] = Find(fa[x]));
}
void Union(int x, int y) {
fa[Find(x)] = fa[Find(y)];
}
int Maxpast(int x, int y) {
int res = 0;
if (x == y) return res;
if (dep[x] < dep[y])
swap(x, y);
for (int i = 30; i >= 0; i--) {
if (dep[x] - (1 << i) >= dep[y]) {
res = max(res, maxn[x][i]);
x = dp[x][i];
}
}
if (x == y) return res;
for (int i = 30; i >= 0; i--) {
if (dp[x][i] != dp[y][i]) {
res = max(res, max(maxn[x][i], maxn[y][i]));
x = dp[x][i];
y = dp[y][i];
}
}
res = max(res, max(maxn[x][0], maxn[y][0]));
return res;
}
void dfs(int u, int fa) {
dp[u][0] = fa;
dep[u] = dep[fa] + 1;
for (int i = head[u]; i; i = edge[i].Next) {
int v = edge[i].To;
if (v == fa) continue;
dfs(v, u);
maxn[v][0] = edge[i].Dis;
}
}
bool cmp(Edge1 x, Edge1 y) {
return x.id < y.id;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].w);
e[i].id = i;
}
for (int i = 1; i <= n; i++)
fa[i] = i;
sort(e + 1, e + 1 + m);
for (int i = 1; i <= m; i++) {
int u = Find(e[i].u), v = Find(e[i].v);
if (u == v) continue;
Union(u, v);
ans += e[i].w;
flag[e[i].id] = 1;
Addedge(e[i].u, e[i].v, e[i].w);
}
dfs(1, 0);
for (int j = 1; j <= 30; j++) {
for (int i = 1; i <= n; i++) {
dp[i][j] = dp[dp[i][j - 1]][j - 1];
maxn[i][j] = max(maxn[i][j - 1], maxn[dp[i][j - 1]][j - 1]);
}
}
sort(e + 1, e + 1 + m, cmp);
for (int i = 1; i <= m; i++) {
LL tmp = 0;
if (flag[i])
tmp = ans;
else
tmp = ans - Maxpast(e[i].u, e[i].v) + e[i].w;
printf("%lld\n", tmp);
}
return 0;
}
原文地址:https://www.cnblogs.com/C202202chenkelin/p/15033423.html
- 详解OSSIM-OSSEC WIN 4771案例
- JSShell:一个基于python的交互式Shell
- golang中操作excel
- 企业安全漏洞通告引擎
- 通过httprouter和redis框架搭建restful api服务
- .NET Core 实现定时抓取博客园首页文章信息并发送到邮箱
- 基于 R 语言和 SPSS 的决策树算法介绍及应用
- Android 8.0 中的安全增强功能
- python2 群发 html 或文本邮件
- windows 安装 storm 及 eclipse 调试 TopN 实例
- shell 学习笔记(16)
- 根据ip查找ISP运营商和归属地的几种方法
- windows 安装 spark 及 pycharm 调试 TopN 实例
- storm kafka 编程指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 撸了个多线程断点续传下载器,我从中学习到了这些知识
- 使用 IOC 控制反转和 DI 依赖注入的意义
- Servlet配置初始值,并获取初始值
- CSS 技巧一则 -- 不定宽溢出文本适配滚动
- 潘石屹用Python解决100个问题 | 最大公约数
- 我的天上传文件又出现问题了(超出大小限制)
- 现在学 PHP 没有发展?来看看这个后台框架你还会这么想吗
- leetcode-easy-array-最大子序和
- Leecode No.3 无重复字符的最长子串
- Solidity 0.6.11 更新
- 潘石屹用Python解决100个问题 | 最小公倍数
- 通过CREATE2获得合约地址:解决交易所充值账号问题
- 小知识:如何判定crontab任务的执行频度
- 以太坊合约静态分析工具Slither简介与使用
- Cesium第一次搭建环境出不来地球的问题