题面:

  把每两个点当成源汇,求N*(N-1)个最小割中不同的有多少个
  N<=850

分析:

  有这样一个结论:一张无向图不同的最小割最多有n-1个。

  那么我们一定可以建出一棵树,使得这棵树中每两个点之间的最小割等于原图的两个点间的最小割。

  我们倒也没必要吧这棵最小割树建出来。我们只需要做做样子,跑一下建树的过程就好,怎么办呢:

  我们在原无向图中任选两个点S,T,求出S-T最小割,那么可以在S-T中间加一条权值等于最小割值得无向边

  然后,分别对S属于的点集合和T属于的点集合递归做上面的过程,直到当前处理的集合只剩下一个点了

  处理的方法就像分治那样就好。

  注意建边时正反容量一样。注意每次要将边的流量恢复。记得要去重。

  具体请看代码:

 #include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;int tot=,n,m;
const int N=,M=,inf=0x3f3f3f3f;
struct node{int y,z,nxt;}e[M];int h[N],c=,q[M];
int S,T,d[N],a[N],tmp[N],ans[N][N],v[];
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,z,h[y]};h[y]=c;
} bool bfs(){
int f=,t=;ms(d,-);d[S]=;q[++t]=S;
while(f<=t){
int x=q[f++];
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==-&&e[i].z)
d[y]=d[x]+,q[++t]=y;
} return (d[T]!=-);
} int dfs(int x,int f){
if(x==T) return f;int w,tm=;
for(int i=h[x],y;i;i=e[i].nxt)
if(d[y=e[i].y]==d[x]+&&e[i].z){
w=dfs(y,min(e[i].z,f-tm));
if(!w) d[y]=-;e[i].z-=w;
e[i^].z+=w;tm+=w;
if(tm==f) return f;
} return tm;
} void solve(int l,int r){
if(l>=r) return ;int sm=;
for(int i=;i<=c;i+=)
e[i].z=e[i^].z=(e[i].z+e[i^].z)>>;
S=a[l],T=a[r];int i,ql,qr;
while(bfs()) sm+=dfs(S,inf);
for(int i=;i<=n;i++) if(~d[i])
for(int j=;j<=n;j++)
if(d[j]==-)
ans[i][j]=ans[j][i]=min(ans[i][j],sm);
for(i=l,ql=l,qr=r;i<=r;i++)
if(~d[a[i]]) tmp[ql++]=a[i];
else tmp[qr--]=a[i];
for(int i=l;i<=r;i++) a[i]=tmp[i];
solve(l,qr);solve(ql,r);
} int main(){
scanf("%d%d",&n,&m);int an=;
for(int i=,x,y,z;i<=m;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z);
for(int i=;i<=n;i++) a[i]=i;
ms(ans,0x7f);solve(,n);
for(int i=;i<=n;i++)
for(int j=+i;j<=n;j++)
v[++tot]=ans[i][j];
sort(v+,v++tot);v[]=-inf;
for(int i=;i<=tot;i++)
if(v[i]!=v[i-]) an++;
printf("%d\n",an);return ;
}

最小割树

BZOJ 4519 不同的最小割 最小割树的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  7. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  8. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

    思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...

  9. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  10. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

随机推荐

  1. centos 6.2 pptp 客户端 安装(转载)

    转自:http://www.lnmpblog.com/archives/611 centos 6.2 64.bit的桌面版本.配置vpn客户端. 步骤: 1.yum -y install pptp 2 ...

  2. bzoj 5281: [Usaco2018 Open]Talent Show【dp】

    注意到sum_t比较小,所以设f[i][j]为选前i头牛,当前sum_t为j的最小sum_w值,转移是f[i][j]=min(f[i-1][j],f[i-1][j-t[i]]+w[i]),然后i维用滚 ...

  3. bzoj3316: JC loves Mkk(单调队列+分数规划)

    Description Input 第1行,包含三个整数.n,L,R.第2行n个数,代表a[1..n]. Output 仅1行,表示询问答案.如果答案是整数,就输出整数:否则,输出既约分数“P/Q”来 ...

  4. sql server 改sa 密码

      ALTER LOGIN sa ENABLE ; ALTER LOGIN sa WITH PASSWORD = 'kongwenyi' ;

  5. Lodash 方法库 原生实现 待完结。。。

    'use strict' let _ = { // 将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组. 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将 ...

  6. Hdu 3605 Escape (最大流 + 缩点)

    题目链接: Hdu 3605  Escape 题目描述: 有n个人要迁移到m个星球,每个星球有最大容量,每个人有喜欢的星球,问是否所有的人都能迁移成功? 解题思路: 正常情况下建图,不会爆内存,但是T ...

  7. http缓存之lastModified和etag

    1.cache-control 访问资源 首次访问页面时间:2018.2.1  9:56  (当前时间=GMT时间+8h) 缓存时长max-age:1 day Expire缓存失效时间:2018.2. ...

  8. 为OS X开发者准备的15个超棒应用

    几乎所有的开发人员在他们日常的开发工作中都有他们自己不可缺少的工具或实用程序集. 这些工具中的每一个都提供了特定的功能,大多数开发者都已经将他们集成到了其工作流程中. 使用这些工具或实用程序不单单只是 ...

  9. jquery基础知识点总结

    Jquery是一个优秀的js库,它简化了js的复杂操作,不需要关心浏览器的兼容问题,提供了大量实用方法. Jquery的写法 方法函数化 链式操作 取值赋值合体] $(“p”).html();   取 ...

  10. 免费大数据搜索引擎 xunsearch 实践

    以前在IBM做后端开发时,也接触过关于缓存技术,当时给了n多文档来学习,后面由于其他紧急的项目,一直没有着手去仔细研究这个技术,即时后来做Commerce的时候,后台用了n多缓存技术,需要build ...