怎么求一张无向图中任意两点之间的最小割?

http://fanhq666.blog.163.com/blog/static/8194342620113495335724/

一张无向图不同的最小割最多有n-1个。

所以可以用这些最小割建出一棵最小割树。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define N 855
#define M 400005
using namespace std;
int read()
{
int p=;char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')p=p*+c-'',c=getchar();
return p;
}
int head[N],ver[M],nxt[M],f[M],tot,ch[N];
void add(int a,int b,int c)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;f[tot]=c;return ;
}
queue<int>q;int S,T;
bool tell()
{
memset(ch,-,sizeof(ch));
q.push(S);ch[S]=;
while(!q.empty())
{
int tmp=q.front();q.pop();
for(int i=head[tmp];i;i=nxt[i])
{
if(f[i]&&ch[ver[i]]==-)
{
ch[ver[i]]=ch[tmp]+;
q.push(ver[i]);
}
}
}
return ch[T]!=-;
}
int zeng(int a,int b)
{
if(a==T)return b;
int r=;
for(int i=head[a];i&&b>r;i=nxt[i])
{
if(f[i]&&ch[ver[i]]==ch[a]+)
{
int t=zeng(ver[i],min(f[i],b-r));
f[i]-=t;f[i^]+=t;r+=t;
}
}
if(!r)ch[a]=-;
return r;
}
int dinic()
{
int r=,t;
while(tell())while(t=zeng(S,inf))r+=t;
return r;
}
void hui()
{
for(int i=;i<=tot;i+=)
{
f[i]=f[i^]=(f[i]+f[i^])>>;
}return ;
}
int tim;
int c[N];
void dfs(int x)
{
c[x]=tim;
for(int i=head[x];i;i=nxt[i])
{
if(f[i]&&c[ver[i]]!=tim)dfs(ver[i]);
}
return ;
}
int p[N];
int ans[N],cnt;
int n,m;
int st[N],st2[N];
void solve(int l,int r)
{
if(l==r)return ;
hui();
S=p[l];T=p[r];
int tmp=dinic();
tim++;dfs(S);
ans[++cnt]=tmp;
int top1=,top2=;
for(int i=l;i<=r;i++)
{
if(c[p[i]]==tim)st[++top1]=p[i];
else st2[++top2]=p[i];
}
for(int i=l;i<=l+top1-;i++)p[i]=st[i-l+];
for(int i=l+top1;i<=r;i++)p[i]=st2[i-l-top1+];
solve(l,l+top1-);solve(l+top1,r);
}
int main()
{
scanf("%d%d",&n,&m);
int t1,t2,t3;tot=;
for(int i=;i<=m;i++)
{
t1=read();t2=read();t3=read();
add(t1,t2,t3);add(t2,t1,t3);
}
for(int i=;i<=n;i++)p[i]=i;
solve(,n);
sort(ans+,ans+cnt+);
int as=;
for(int i=;i<=cnt;i++)
{
if(i==||ans[i]!=ans[i-])
{
as++;
}
}
printf("%d\n",as);
}

bzoj 4519: [Cqoi2016]不同的最小割 最小割树的更多相关文章

  1. BZOJ 4519 [CQOI2016]不同的最小割

    这道题目很奇怪. 为什么奇怪?因为这道题用了一种叫分治最小割/最小割树的玩意. 以前从来没有见过这东西. 推荐一个讲这玩意的博客 写起来还是很顺手的. #include<iostream> ...

  2. bzoj 4519: [Cqoi2016]不同的最小割【最小割树Gomory–Hu tree】

    算法详见:http://www.cnblogs.com/lokiii/p/8191573.html 求出点两两之间的最小割之后,把他们扔到map/set里跑即可 可怕的是map和set跑的时间竟然完全 ...

  3. BZOJ 4520 [Cqoi2016]K远点对(KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4520 [题目大意] 求K远点对距离 [题解] 修改估价函数为欧式上界估价,对每个点进行 ...

  4. 4519: [Cqoi2016]不同的最小割

    4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 489 Solved: 301 [Submit][Stat ...

  5. 【BZOJ-4519】不同的最小割 最小割树(分治+最小割)

    4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 393  Solved: 239[Submit][Stat ...

  6. scu - 3254 - Rain and Fgj(最小点权割)

    题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...

  7. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  8. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  9. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)

    2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...

随机推荐

  1. Redis的C语言客户端(hiredis)的安装和使用

    关键词:hiredis, cRedis, redis clients, redis客户端, C客户端, 华为云分布式缓存服务 hiredis是一个非常全面的C语言版redis接口库,支持所有命令.管道 ...

  2. Linux 读书笔记 三 (第二章)

      一.学习目标 1. 理解二进制在计算机中的重要地位 2. 掌握布尔运算在C语言中的应用 3. 理解有符号整数.无符号整数.浮点数的表示 4. 理解补码的重要性 5. 能避免C语言中溢出,数据类型转 ...

  3. caffe可视化模型

    进入$CAFFE_ROOT/python: $ python draw_net.py ../models/bvlc_reference_caffenet/train_val.prototxt caff ...

  4. DocX插件

    DocX是一个用C#编写的.NET库,它允许开发人员以简单直观的方式操作Word文件.

  5. VS2013的安装与C#进行简单单元测试(英文版教程)

    这次安装这个软件可是花了我不少时间,其中遇到的问题不言而喻,下面讲解一下我完成这次作业以及分享一些个人体会吧! 第一步:提供下载地址(https://www.visualstudio.com/down ...

  6. boolean类型的按位或||和|的区别

    boolean类型既可以使用&&和||做逻辑运算,也可以使用&和|做逻辑运算,但前者是经过优化的(执行短路运算),后者未优化. 以下代码验证: 逻辑或|| public cla ...

  7. iOS App之间常用的五种通信方式及适用场景总结

    iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不能随意跨越自己的沙盒去访问 ...

  8. 初入React(一)

    React:是2013年Facebook在github上的一个开源js库,它将用户界面抽象为一个个组件,再由开发者将其组合成页面.它不是完整的MVC/MVVM框架,专注于提供清晰.简洁的view层解决 ...

  9. Apache+Nginx+php共存(一)

    在实际开发中个人的电脑中经常需要安装 WNMRP.WAMRP.LNMRP.LAMRP等各种开发环境来应对不同的开发需求. 此篇主要是对WINDOWS系统下 Apache+Nginx + PHP +My ...

  10. 无法安装HAXM (VT-X is not turned on)

    安装HAXM的时候,VT-X is not turned on. 进入bios查看,已经启动了vt-x.上网搜索发现解决有一部分电脑是因为安装了Hyper-V,解决的方法: 管理员运行cmd,输入如下 ...