【BZOJ2229】【ZJOI2011】最小割
冷门知识点……
原题:
小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。 对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割” 现给定一张无向图,小白有若干个形如“图中有多少对点它们的最小割的容量不超过x呢”的疑问,小蓝虽然很想回答这些问题,但小蓝最近忙着挖木块,于是作为仍然是小蓝的好友,你又有任务了。
1<=u,v<=n,0<=c<=106
分治最小割:O(跑得过)时间处理n个点两两之间的最小割
每次在当前集合中随意找两个点,最小割成两个集合,递归处理这两个集合,开O(n^2)数组记录答案
注意初始化
没了
(注意"两组测试数据之间用空行隔开",否则PE)
代码:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<cmath>
- using namespace std;
- const int oo=;
- int rd(){int z=,mk=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
- while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
- return z*mk;
- }
- struct ddd{int nxt,y,v,rvs;}e[]; int lk[],ltp=;
- inline void ist(int x,int y,int z){
- e[++ltp].nxt=lk[x],lk[x]=ltp,e[ltp].y=y,e[ltp].v=z,e[ltp].rvs=ltp+;
- e[++ltp].nxt=lk[y],lk[y]=ltp,e[ltp].y=x,e[ltp].v=z,e[ltp].rvs=ltp-;
- }
- int n,m,qst; int s,t;
- int lvl[];
- int q[],hd=;
- bool st[];
- int quq[],tmp[];
- int mnct[][];
- bool gtlvl(){
- memset(lvl,,sizeof(lvl));
- q[hd=]=s,lvl[s]=;
- for(int k=;k<=hd;++k)
- for(int i=lk[q[k]];i;i=e[i].nxt)if(e[i].v && !lvl[e[i].y])
- lvl[e[i].y]=lvl[q[k]]+,q[++hd]=e[i].y;
- return lvl[t];
- }
- int mxflw(int x,int y){
- if(x==t) return y;
- int bwl=,flw=;
- for(int i=lk[x];i && bwl<y;i=e[i].nxt)if(e[i].v && lvl[e[i].y]==lvl[x]+)
- if((flw=mxflw(e[i].y,min(y-bwl,e[i].v)))){
- bwl+=flw;
- e[i].v-=flw,e[e[i].rvs].v+=flw;
- }
- if(!bwl) lvl[x]=;
- return bwl;
- }
- void gtst(){
- q[hd=]=s,st[s]=true;
- for(int k=;k<=hd;++k)for(int i=lk[q[k]];i;i=e[i].nxt)
- if(e[i].v && !st[e[i].y]) st[e[i].y]=true,q[++hd]=e[i].y;
- }
- int dnc(){
- int bwl=,flw=;
- while(gtlvl())while((flw=mxflw(s,oo))) bwl+=flw;
- memset(st,,sizeof(st));
- gtst();
- return bwl;
- }
- void sprt(int l,int r){
- if(l>=r) return ;
- for(int i=;i<=ltp;++i) e[i].v=e[e[i].rvs].v=(e[i].v+e[e[i].rvs].v)>>;
- s=quq[l],t=quq[r];
- int mxflw=dnc();
- for(int i=;i<=n;++i)if(st[i])for(int j=;j<=n;++j)if(!st[j])
- mnct[j][i]=mnct[i][j]=min(mnct[i][j],mxflw);
- int hd1=l,hd2=r;
- for(int i=l;i<=r;++i) tmp[(st[quq[i]] ? hd2-- : hd1++)]=quq[i];
- for(int i=l;i<=r;++i) quq[i]=tmp[i];
- sprt(l,hd1-),sprt(hd2+,r);
- }
- void clr(){ memset(lk,,sizeof(lk)),ltp=; memset(mnct,,sizeof(mnct));}
- int main(){//freopen("ddd.in","r",stdin);
- int T; cin>>T; while(T--){ clr();
- cin>>n>>m;
- for(int i=;i<=n;++i) quq[i]=i;
- int l,r,v,cnt=;
- while(m--) l=rd(),r=rd(),v=rd(),ist(l,r,v);
- sprt(,n);
- cin>>qst;
- while(qst--){
- v=rd(),cnt=;
- for(int i=;i<=n;++i)for(int j=i+;j<=n;++j)if(mnct[i][j]<=v) ++cnt;
- printf("%d\n",cnt);
- }
- cout<<endl;
- continue;
- }
- return ;
- }
【BZOJ2229】【ZJOI2011】最小割的更多相关文章
- BZOJ2229: [Zjoi2011]最小割
题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...
- bzoj千题计划139:bzoj2229: [Zjoi2011]最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- [bzoj2229][Zjoi2011]最小割_网络流_最小割树
最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...
- BZOJ2229—— [Zjoi2011]最小割
0.题目大意:求两点之间的最小割,然后找出其中小于x的数量 1.分析:最小割树水题,上个板子就好 #include <queue> #include <ctime> #incl ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...
- BZOJ2229: [Zjoi2011]最小割(最小割树)
传送门 最小割树 算法 初始时把所有点放在一个集合 从中任选两个点出来跑原图中的最小割 然后按照 \(s\) 集合与 \(t\) 集合的归属把当前集合划分成两个集合,递归处理 这样一共跑了 \(n − ...
- bzoj2229: [Zjoi2011]最小割(最小割树)
传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了……点数那么少……每次跑出一个最大流就暴力搞一遍就好了 //minamoto #includ ...
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- 【BZOJ2229】[Zjoi2011]最小割 最小割树
[BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
随机推荐
- 每天CSS学习之text-shadow
今天学习的是CSS3的一个属性text-shadow.该属性能映射出文字的阴影. text-shadow一共就四个属性: text-shadow: h-shadow v-shadow [blur] ...
- mvc+struct1+struct2
转一篇写得很棒的文章:https://my.oschina.net/win199176/blog/208171?p=7&temp=1495894148424 1.基于web开发中最原始的jsp ...
- (Java学习笔记) Java Networking (Java 网络)
Java Networking (Java 网络) 1. 网络通信协议 Network Communication Protocols Network Protocol is a set of rul ...
- Eclipse快捷键+遇到补充
MyEclipse 快捷键1(CTRL) Ctrl+1 快速修复Ctrl+D: 删除当前行Ctrl+Q 定位到最后编辑的地方Ctrl+L 定位在某行Ctrl+O 快速显示 OutLineCtrl+T ...
- java 设计模式参考资料
参考博客 http://www.cnblogs.com/lin3615/p/3783272.html 设计模式之责任链模式http://www.cnblogs.com/draem0507/p/3784 ...
- tf.trainable_variables() and tf.all_variables()
tf.trainable_variables() 返回的是 所有需要训练的变量列表 tf.all_variables() 返回的是 所有变量的列表 v = tf.Variable(0, name=' ...
- NioEventLoop(netty 4.1)
里面有个excecutor属性, 在loopgroup实例化loop的时候, 如果execute一个runnable的task的时候,检测loop启动了没有,没启动的话,执行excecutor的exe ...
- poj3279(dfs+二进制枚举思路)
题意转载自https://www.cnblogs.com/blumia/p/poj3279.html 题目属性:DFS 相关题目:poj3276 题目原文:[desc]Farmer John know ...
- marquee 的浏览器兼容性
marquee 在IE,firefox,chrome ,safari下都能正常的实现走马灯效果,兼容性没有问题 并且两个关键属性scrollamount(滚动速度)direction(滚动方向) 所有 ...
- ::selection 选择器
使被选中的文本成为红色:::selection { color:#ff0000; } ::-moz-selection { color:#ff0000; }