P5934 [清华集训2012]最小生成树
简要题意
给你一个 \(N\) 个点,\(M\) 条边的 无向连通 带权图。给定一条边 \((u,v,L)\),请问需要在原图中删除多少条边,使得将 \((u,v,L)\) 插入图后,它既可能在最小生成树上,又可能在最大生成树上。
对于 \(100\%\) 的数据,满足 \(N\leq 20000,M\leq 200000,L\leq 20000\)。
思路
如果一条插入边 \((u,v,L)\) 后该边可能在最小生成树上,那么如果将边权小于 \(L\) 的边组成一个新图,则新图不连通。
证明:
- 如果新图连通,则对新图求最小生成树,则最小生成树一定是原图的最小生成树(显然),然后 \((u,v,L)\) 就一定不在任意一个最小生成树中。与前句矛盾,所以必须不连通。
- 如果新图不连通,则不存在最小生成树,使得任意一条树边边权小于 \(L\)。又因为原图连通,所以插入 \((u,v,L)\) 后,原图依旧连通。如果原图的最小生成树边集为 \(S\),则满足 \(\forall (x,y,z) \in S,z \geq L\)。 \((u,v,L)\) 插入 \(S\),则最小生成树变为基环树。将环上最大边权的边删除,则该边一定不是 \((u,v,L)\)(除非环上边权都相等),所以 \((u,v,L)\) 可能在插入后的最小生成树上。
(可能有一些不严谨,敬请指正)
同理可得:如果一条插入边 \((u,v,L)\) 后该边可能在最大生成树上,那么如果将边权大于 \(L\) 的边组成一个新图,则新图不连通。
所以如果我们建出了这两个新图,则相当于就是在求删除多少条边后全图(其实就是 \(u\to v\))不连通。最小割解决。
最后答案就是两图最小割答案和,由于两个图的割集的交集一定为空集(因为它们没有相同的点),所以可以加法原理。
最后说一句,为什么是题面可能是最小(最大)生成树呢,因为可能有边权相等的边。
时间复杂度 \(O(\operatorname{maxflow}(n,m))\),可以通过本题。
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const int N = 200000+5,M = 200000+5;
int s,t,U,V,L,ret;
namespace MaxFlow{
// 自己打一遍 Dinic 最大流,以防忘记
struct edge{
int nxt,to,w;
} g[M<<2];
int head[N],ec,dis[N],now[N];
bool vis[N];
void add(int u,int v,int w){
g[++ec].nxt=head[u];
g[ec].to=v;
g[ec].w=w;
head[u]=ec;
}
int bfs(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s);
dis[s]=0;
now[s]=head[s];
vis[s]=1;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(g[i].w>0 && !vis[v]){
q.push(v);
vis[v]=1;
now[v]=head[v];
dis[v]=dis[u]+1;
if(v==t){
return 1;
}
}
}
}
return 0;
}
int dfs(int x,int sum){
if(x==t){
return sum;
}
int k,res=sum;
for(int i=now[x];i&∑i=g[i].nxt){
now[x]=i;
int v=g[i].to;
if(g[i].w>0&&(dis[v]==dis[x]+1)){
k=dfs(v,min(res,g[i].w));
g[i].w-=k;
g[i^1].w+=k;
res-=k;
}
}
return sum-res;
}
int dinic(){
int ans=0;
while(bfs()){
ans+=dfs(s,LLONG_MAX);
}
return ans;
}
void addedge(int u,int v,int cap){
add(u,v,cap);
add(v,u,-cap);
}
void clean(void){
ec=0;
memset(head,0,sizeof(head));
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(g,0,sizeof(g));
}
}
using namespace MaxFlow;
struct Edge{int from,to,weight;};
vector<Edge> graph;
signed main(){
cin>>n>>m;
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
graph.push_back({u,v,w});
}
cin>>U>>V>>L;
s=U,t=V;
clean();
for(Edge i:graph){
if(i.weight < L){
addedge(i.from,i.to,1);addedge(i.to,i.from,1);
}
}
ret=dinic();
clean();
for(Edge i:graph){
if(i.weight > L){
addedge(i.from,i.to,1);addedge(i.to,i.from,1);
}
}
cout<<ret+dinic()<<'\n';
return 0;
}
P5934 [清华集训2012]最小生成树的更多相关文章
- P2260 [清华集训2012]模积和
P2260 [清华集训2012]模积和 整除分块+逆元 详细题解移步P2260题解板块 式子可以拆开分别求解,具体见题解 这里主要讲的是整除分块(数论分块)和mod不为素数时如何求逆元 整除分块:求Σ ...
- P2260 [清华集训2012]模积和 【整除分块】
一.题目 P2260 [清华集训2012]模积和 二.分析 参考文章:click here 具体的公式推导可以看参考文章.博主的证明很详细. 自己在写的时候问题不在公式推导,公式还是能够比较顺利的推导 ...
- P5934-[清华集训2012]最小生成树【最小割】
正题 题目链接:https://www.luogu.com.cn/problem/P5934 题目大意 给出\(n\)个点\(m\)条边的一张图,再加入一条边\((u,v,L)\)求至少删掉多少条边可 ...
- BSOJ 4062 -- 【清华集训2012】串珠子
Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不 ...
- 洛谷 P2260 [清华集训2012]模积和 || bzoj2956
https://www.lydsy.com/JudgeOnline/problem.php?id=2956 https://www.luogu.org/problemnew/show/P2260 暴力 ...
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
- luoguP2260 [清华集训2012]模积和
题意 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}n\%i*m\%j*[i!=j]\) \(\sum\limits_{i=1}^{n}\sum\limits ...
- Luogu P4247 [清华集训2012]序列操作
题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(q\) 次操作,每次操作形如以下三种: I a b c,表示将 \([a,b]\) 内的元素加 \(c\). R a b,表示将 \([a ...
- UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
#274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...
- 清华集训2015 V
#164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...
随机推荐
- 二、python基本数据类型
一. 字面量 代码中,被写在代码中的固定的值,称之为字面量 Python常用6种值(数据)类型 字符串(string) :又称文本,是由任意数量的字符如中文.英文.各类符号.数字等组成.所以叫做字符的 ...
- CF Round #829 题解 (Div. 2)
F 没看所以摆了 . 看拜月教教主 LHQ 在群里代打恰钱 /bx 目录 A. Technical Support (*800) B. Kevin and Permutation (*800) C. ...
- Git 02: git管理码云代码仓库 + IDEA集成使用git
Git项目搭建 创建工作目录与常用指令 工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文. 日常使用只要记住下图6个命令: ...
- 优雅的写好Vue项目代码 — 路由拆分、Vuex模块拆分、element按需加载
目录 路由的拆分 VUEX模块拆分 Element UI库按需加载的优雅写法 路由的拆分 项目较大路由较多时,路由拆分是一个不错的代码优化方案,按不同业务分为多个模块,结构清晰便于统一管理. requ ...
- javaWEB中的四种域对象
javaWEB中的四种域对象 (1)ServletContext ServletContext是最大的Web域对象,在整个工程内有效,可以存储一些需要全局部署的配置文件,也可以存储其他信息,不过因为它 ...
- Windows操作系统搭建Lsky Pro
写在前面 本文主要介绍在Windows下部署兰空图床,以及安装过程, 非Windows系统可以参考本文章的安装流程,结合自己系统版本进行部署 图床用处 图床在日常的用处非常广泛,尤其对于经常写博客的人 ...
- 记一次多个Java Agent同时使用的类增强冲突问题及分析
摘要:Java Agent技术常被用于加载class文件之前进行拦截并修改字节码,以实现对Java应用的无侵入式增强. 本文分享自华为云社区<记一次多个JavaAgent同时使用的类增强冲突问题 ...
- Go实现栈与队列基本操作
@ 目录 一 前言 二 实现栈与队列基本操作 2.1 栈基本操作 2.2 队列基本操作 三 用栈实现队列 3.1 理论 3.2 算法题 3.3 思路 3.4 代码部分 四 用队列实现栈 4.1 理论 ...
- Ajax基础(中)
这节主要在上节的基础上学会如何使用Ajax 源码下载: 链接:https://pan.baidu.com/s/1kG-vACFxneAZqONdo97XrQ 提取码:k21y 在WebStorm中打开 ...
- Perl引用
引用就是C语言中的指针,perl引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 在变量前面加一个\就得到了这个变量的一个引用 #!usr/bin/p ...