【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 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
随机推荐
- linux下 gogs的安装和web钩子
linux系统下 gogs下载安装以及web钩子的使用 (1)下载gogs 官方网址:https://dl.gogs.io/ 选择合适的版本,解压后就可以使用了 启动gogs的命令: ./gos ...
- JSP动态网页
01.什么是服务器 02.什么是动态网页 动态网页是指在服务器端运行的,使用程序语言设计的交互式网页,它们会根据某种条件的变化,返回不同的网页内容.可以让用户和服务器交互的网站 动态网站可以实现交互 ...
- PHP和Mysql事物处理
这几天做支付的时候,又用到了事物,为了方便自己以后查看,今天闲的没事就把以前的东西整理下.(其中引用别人的东西,在这里谢谢他们贡献的代码!) 一.事务处理概述: 事务:是若干事件的集合 事务处理:当所 ...
- redis、memcache、mongoDB 对比
从以下几个维度,对 redis.memcache.mongoDB 做了对比. 1.性能 都比较高,性能对我们来说应该都不是瓶颈. 总体来讲,TPS 方面 redis 和 memcache 差不多,要大 ...
- 查找xml中的接口名及涉及表名并输出
#! /usr/bin/env python3 # -*- coding:utf-8 -*- import xml.dom.minidom #该模块被用来处理xml文件 import re #正则表 ...
- minidebug学习分析 01 基本框架
0x01 基本框架 基本框架就是CreateProcess启动目标程序,再通过调试事件DEBUG_EVENT在调试循环中监控程序的行为. (1)CreatProcess BOOL CreateP ...
- Java的第一个晞月自己打的程序
1.编写一个程序,求1!+2!+…+10!的值. package xxx; public class abc { public static void main(String args[]) { in ...
- DevExpress ASP.NET v18.2新功能详解(二)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress ASP.NET Cont ...
- Android开发---如何操作资源目录中的资源文件4 ---访问xml的配置资源文件的内容
Android开发---如何操作资源目录中的资源文件4 XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构. XmlPullParser可以用于解释xml文件 效果图: 描述: ...
- 查看电脑安装的JDK版本
1.输入java -d32 -version,若出现如下界面则是32位 2.java -d64 -version,因为是32位的,所以结果如下