BZOJ 4519 [CQOI2016]不同的最小割
这道题目很奇怪.
为什么奇怪?因为这道题用了一种叫分治最小割/最小割树的玩意.
以前从来没有见过这东西.
推荐一个讲这玩意的博客
写起来还是很顺手的.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<ctime>
#include<string>
#include<iomanip>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define FILE "dealing"
#define up(i,j,n) for(int i=j;i<=n;++i)
#define db double
#define uint unsigned ll
#define eps 1e-12
#define pii pair<ll,ll>
ll read(){
ll x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f*x;
}
const ll maxn=20500,limit=1e6,mod=(ll)(7+1e9+0.1);
const ll inf=(ll)(1e9);
template<class T>bool cmax(T& a,T b){return a<b?a=b,true:false;}
template<class T>bool cmin(T& a,T b){return a>b?a=b,true:false;}
template<class T>T min(T& a,T& b){return a<b?a:b;}
template<class T>T max(T& a,T& b){return a>b?a:b;}
int n,m,S,T,id[maxn],vis[maxn],tmp[maxn],w[maxn],tot=0;
struct node{
int y,next,flow,rev;
}e[maxn];
int len=1,linkk[maxn];
void insert(int x,int y,int flow){
e[++len].y=y;
e[len].next=linkk[x];
linkk[x]=len;
e[len].flow=flow;
e[len].rev=len+1;
e[++len].y=x;
e[len].next=linkk[y];
linkk[y]=len;
e[len].flow=flow;
e[len].rev=len-1;
}
int d[maxn],q[maxn],head,tail;
bool makelevel(){
up(i,1,n)d[i]=-1;
d[S]=0;head=tail=0;
q[++tail]=S;
while(++head<=tail){
int x=q[head];
for(int i=linkk[x];i;i=e[i].next)
if(d[e[i].y]==-1&&e[i].flow)d[e[i].y]=d[x]+1,q[++tail]=e[i].y;
}
return d[T]!=-1;
}
int makeflow(int x,int flow){
if(x==T||!flow)return flow;
int maxflow=0,dis=0;
for(int i=linkk[x];i&&maxflow<flow;i=e[i].next){
if(d[e[i].y]==d[x]+1&&e[i].flow)
if(dis=makeflow(e[i].y,min(flow-maxflow,e[i].flow))){
e[i].flow-=dis;
e[i^1].flow+=dis;
maxflow+=dis;
}
}
if(!maxflow)d[x]=-1;
return maxflow;
}
int dinic(){
int ans=0,d;
while(makelevel())
while(d=makeflow(S,inf))
ans+=d;
return ans;
}
void dfs(int x){
vis[x]=1;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].flow&&!vis[e[i].y])
dfs(e[i].y);
}
}
void divide(int l,int r){
if(l==r)return;
for(int i=2;i<=len;i+=2)
e[i].flow=e[i^1].flow=(e[i].flow+e[i^1].flow)>>1;
S=id[l],T=id[r];
int maxflow=dinic();
w[++tot]=maxflow;
up(i,1,n)vis[i]=0;
dfs(S);
int L=l,R=r;
up(i,l,r){
if(vis[id[i]])tmp[L++]=id[i];
else tmp[R--]=id[i];
}
up(i,l,r)id[i]=tmp[i];
divide(l,L-1);divide(R+1,r);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read(),m=read();
up(i,1,n)id[i]=i;
up(i,1,m){
int x=read(),y=read(),v=read();
insert(x,y,v);
}
divide(1,n);
sort(w+1,w+tot+1);
w[0]=-1;
int ans=0;
up(i,1,tot)if(w[i]!=w[i-1])ans++;
printf("%d\n",ans);
return 0;
}
BZOJ 4519 [CQOI2016]不同的最小割的更多相关文章
- bzoj 4519: [Cqoi2016]不同的最小割 最小割树
怎么求一张无向图中任意两点之间的最小割? http://fanhq666.blog.163.com/blog/static/8194342620113495335724/ 一张无向图不同的最小割最多有 ...
- bzoj 4519: [Cqoi2016]不同的最小割【最小割树Gomory–Hu tree】
算法详见:http://www.cnblogs.com/lokiii/p/8191573.html 求出点两两之间的最小割之后,把他们扔到map/set里跑即可 可怕的是map和set跑的时间竟然完全 ...
- 4519: [Cqoi2016]不同的最小割
4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 489 Solved: 301 [Submit][Stat ...
- bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=4519 最小割树 #include<queue> #include<cstdio&g ...
- bzoj4519: [Cqoi2016]不同的最小割(分治最小割)
4519: [Cqoi2016]不同的最小割 题目:传送门 题解: 同BZOJ 2229 基本一样的题目啊,就最后用set记录一下就ok 代码: #include<cstdio> #inc ...
- [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割
题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...
- 【BZOJ4519】[Cqoi2016]不同的最小割 最小割树
[BZOJ4519][Cqoi2016]不同的最小割 Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分 ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
随机推荐
- ofstream的使用方法
ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C 中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包 ...
- 《linux 内核全然剖析》 mktime.c
tm结构体的定义在time.h里面 struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_y ...
- Vue避免 v-if 和 v-for 用在一起
永远不要把 v-if 和 v-for 同时用在同一个元素上. 一般我们在两种常见的情况下会倾向于这样做: 为了过滤一个列表中的项目 (比如 v-for="user in users" ...
- mongodb:monogo和php整合
1.到如下网址,下载php扩展包,找一个最新stable版的.
- Linux视频培训教程
很详尽的Linux培训教程,既包含日常工作常常要用到的实践及技巧,又包含Linux认证及系统管理及架构,讲的很不错.最关键的.这么具体,完整的教程还是免费的.花了点时间拿它整理了下. 第一部分: Li ...
- 非常酷的word技巧---删除行前的空格
今天整理一篇文章的时间遇见一个问题,非常多行前的空格严重影响美观.搞计算机的就是爱折腾.于是做了各种尝试完美解决,以下把方法发布例如以下,事实上非常easy哦! 问题例如以下情况所看到的: 解决的方法 ...
- nginx+keepalived实现双机热备高可用性
搭建准备: 机器两台 ip分别为192.168.100.128 192.168.100.129(能够用虚拟机測试.虚拟机网络模式为NET模式.且为静态ip) 另外须要准备一个虚拟ip对外提供服务.即通 ...
- DataView中的 Sort 排序
using System.Data; using System; public class A { static void Main(string[] args) { DataTable locati ...
- wifi认证Portal开发系列(三):portal协议
中国移动WLAN业务PORTAL协议规范介绍 一.用户上线认证流程 上线流程完成用户账号的认证,并把认证结果通知Portal Server,Portal server将会通知WLAN用户并且显示相应的 ...
- Delphi下如何使程序在Win7/Vista上用管理员权限运行(转)
Delphi程序必须在资源里面嵌入MANIFEST信息 一 首先编辑一个文件,内容如下: <?xml version="1.0" encoding="UTF-8&q ...