P4123-[CQOI2016]不同的最小割【网络流,分治】
正题
题目大意:https://www.luogu.com.cn/problem/P4123
题目大意
一张无向图,求所有点对之间有多少不同的最小割。
解题思路
考虑分治的做法,如果我们得知了(s,t)(s,t)(s,t)的最小割www,并且剩下的残量网络中连通点集SSS与sss连通,点集TTT与ttt连通。那么点集SSS到TTT的每个点对之间的最小割都是www。然后分治到两个点集去做即可。
这样下来最小割的期望次数是O(n)O(n)O(n)级别的,可以通过本题。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
const int N=900,inf=2147483647/3;
struct node{int to,next,w,ret;
}a[N*20];
int n,m,ls[N],tot=1;
int dep[N],p[N],ans;
map<int,int> mp;
queue<int> q;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].ret=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=w;a[tot].ret=w;return;
}
bool bfs(int s,int t){memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty())q.pop();q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow,int t){int rest=0,k;if(x==t)return flow;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(flow-rest,a[i].w),t));a[i].w-=k;a[i^1].w+=k;if(flow==rest)return flow;}if(!rest)dep[x]=0;return rest;
}
bool cmp(int x,int y)
{return dep[x]<dep[y];}
void solve(int l,int r){if(l==r)return;int w=0; while(bfs(p[l],p[r]))w+=dinic(p[l],inf,p[r]);if(!mp.count(w))mp[w]=1,ans++;sort(p+l,p+1+r,cmp);int mid=l;for(int i=l;i<=r;i++)if(dep[p[i]]){mid=i;break;}for(int i=1;i<=tot;i++)a[i].w=a[i].ret;solve(l,mid-1);solve(mid,r);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)p[i]=i;for(int i=1;i<=m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);}solve(1,n);printf("%d\n",ans);
}
P4123-[CQOI2016]不同的最小割【网络流,分治】相关推荐
- 【LuoguP33294123】[ZJOI2011]最小割[CQOI2016]不同的最小割
链接1 链接2 题意简述 第一个题 : 问图中有多少不同的最小割数值 第二个题 : \(q\) 次询问图中多少对点对之间的最小割小于 \(x\) . Sol 两个都是模板题就放一起了. 求完最小割树直 ...
- P4126 [AHOI2009]最小割(网络流/最小割)
P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...
- 分治最小割 学习总结
这是一种可以较快的求解任意两点间最小割的算法 正常的暴力的话我们要枚举点对,一共要做O(n^2)次网络流 而我们注意到设某一个S->T最小割中两个点x,y,满足x在S集合且y在T集合中 设S-& ...
- 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)
I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...
- 最小割分治(最小割树):BZOJ2229 BZOJ4519
定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【BZOJ1797】[AHOI2009]最小割(网络流)
[BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
«问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...
- P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)
P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...
最新文章
- 树形DP入门题目推荐以及解析
- HZOJ 斐波那契(fibonacci)
- Spring Boot——[Unable to start LiveReload server]解决方案
- github的基础使用
- 数学大师丘成桐:中国的科技至少要倒退20年
- Could not find an NgModule. Use the skip-import option to skip importing in
- 芝麻信用很高,为什么贷款还是被拒了?
- 开启事物_开启大门,聚焦在正确的事物上
- 操作系统用户态内核态线程同步
- 编程师代码G都喜欢的|细致场景森系插画手机壁纸
- editplus php格式化,让Editplus自动格式化css和js
- 用于空间搜索的四叉树
- 计算机网络的概述以及网络的组成
- “征服自己是最大的胜利,被征服是最大的耻辱和邪恶。”
- 如何打开.pt文件?
- GB/T 8170-2008 数值修约规则与极限数值的表示和判定
- Spring框架学习笔记---完结
- 视频流媒体播放器EasyPlayer-RTSP-Android 如何随意切换播放视频流?
- 计算机用通讯电压多少,电脑ATX电源改13.8V通信用电源!
- C++使用AES+Base64算法对文本进行加密
热门文章
- php运算符优先级题目,详解php运算符优先级
- mysql数据库已连接数据库_001. 【已解决】Java连接MYSQL 数据库的连接步骤
- android管理activity顺序,android activity 六个主要函数以及一些调用顺序
- 北斗三号b1c频点带宽_【导航论坛】北斗三号卫星导航信号及接收策略
- abb限位开关已打开drv1_广告雕刻机限位开关触发
- tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...
- 沙洋有几个微服务群_集群 分布式 微服务
- java中什么是同步_Java中,“synchronized”(同步)是什么意思?什么时候应该用synchronized? - Break易站...
- 开头th_是什么文件_Python文件读写最详细的讲解
- ndr4108贴片晶振是多少频率_关于山羊挺身你知道多少?这些干货速来了解一下...