题目大意:一个无向图,求所有点对不同的最小割种类数

最小割最多有n-1个,这n-1个最小割构成一个最小割树

分治法寻找n-1个最小割。对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和与T相连的所有点构成S集与T集,更新S集与T集的最小割。然后递归处理两个集合。

最后将最小割排序,找出有多少不同最小割即可

#include<bits/stdc++.h>
#define inf 0x7ffffff
using namespace std;
inline int read(){
int s=;char ch=getchar();
for(;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';ch=getchar())s=s*+ch-'';
return s;
}
struct edge{
int to,next;
int cap;
}G[];
int tot=,h[],S,T;
void add(int x,int y,int z){
tot++;G[tot].to=y;G[tot].next=h[x];G[tot].cap=z;h[x]=tot;
}
int vis[],mark[];
int a[];
int n,m;
set<int>s;
bool bfs(){
memset(vis,,sizeof(vis));
queue<int>Q;Q.push(S);vis[S]=;
while(!Q.empty()){
int u=Q.front();Q.pop();
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v]||G[i].cap<=)continue;
vis[v]=vis[u]+;
Q.push(v);
}
}return vis[T];
}
int dfs(int u,int w){
if(u==T||w==)return w;
int flow=;
for(int i=h[u];i;i=G[i].next){
int v=G[i].to;
if(vis[v]!=vis[u]+||G[i].cap<=)continue;
if(int t=dfs(v,min(w,G[i].cap))){
G[i].cap-=t;G[i^].cap+=t;
flow+=t;w-=t;
if(!w)break;
}
}
if(!flow)vis[u]=;
return flow;
}
int dinic(){
int f=;
while(bfs())f+=dfs(S,inf);
return f;
}
void dfs(int x){
mark[x]=;
for(int i=h[x];i;i=G[i].next)
if(G[i].cap&&!mark[G[i].to])
dfs(G[i].to);
}
void clear(){
for(int i=;i<=tot;i+=)
G[i].cap=G[i^].cap=(G[i].cap+G[i^].cap)/;
}
int tmp[];
void solve(int l,int r){
if(l==r)return;
clear();
S=a[l],T=a[r];
int t=dinic();
s.insert(t);
memset(mark,,sizeof(mark));
dfs(S);
int L=l,R=r;
for(int i=l;i<=r;++i)
if(mark[a[i]])tmp[L++]=a[i];
else tmp[R--]=a[i];
for(int i=l;i<=r;++i)a[i]=tmp[i];
solve(l,L-);solve(R+,r);
}
int main(){
n=read();m=read();
for(int i=;i<=m;++i){
int u=read(),v=read(),w=read();
add(u,v,w);add(v,u,w);
}
for(int i=;i<=n;++i)a[i]=i;
solve(,n);
printf("%d\n",s.size());
return ;
}

CQOI 2016 不同的最小割的更多相关文章

  1. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  2. ZJOI 最小割 CQOI 不同的最小割 (最小割分治)

    题目1 ZJOI 最小割 题目大意: 求一个无向带权图两点间的最小割,询问小于等于c的点对有多少. 算法讨论: 最小割 分治 代码: #include <cstdlib> #include ...

  3. (2016北京集训十三)【xsy1532】网络战争 - 最小割树+树上倍增+KD树

    题解: 好题!! 这题似乎能上我代码长度记录的前五? 调试时间长度应该也能上前五QAQ 首先题目要求的明显就是最小割,当然在整个森林上求Q次最小割肯定是会GG的,所以我们需要一个能快速求最小割的算法— ...

  4. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  5. 【HDU 5855】Less Time, More profit(网络流、最小割、最大权闭合子图)

    Less Time, More profit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  6. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  7. BZOJ4519: [Cqoi2016]不同的最小割

    Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 ...

  8. hdu-5889-最短路+网络流/最小割

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. HDU 5889 Barricade(最短路+最小割水题)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

随机推荐

  1. JavaScript浮动广告代码,容纯DIV/CSS对联漂浮广告代码,兼容性非常好的js右下角与漂浮广告代码

    基于JavaScript代码实现随机漂浮图片广告,javascript图片广告 在网上有很多这样的代码,不过未必符合W3C标准,因为在头部加上<!DOCTYPE html>类似标签之后,漂 ...

  2. 【转载】兼容php5,php7的cURL文件上传示例

    转载来自: http://www.huanlinna.com/2016/06/25/coding/php5-php7-upload-demo-via-curl.html https://segment ...

  3. POCO库——Foundation组件概述

    Foundation组件作为POCO库的基础组件,主要包含了核心Core.缓存Cache.加解密Crypt.日期时间DateTime.动态类型Dynamic.事件events.文件系统Filesyst ...

  4. [UWP]UWP App Data存储和获取

    这篇博客介绍如何在UWP开发时,如何存储App Data和获取. App Data是指用户的一些设定,偏好等.例如,App的主题,是否接收推送,离线接收消息等.需要区分下App Data和User D ...

  5. 如何快速找到排好序的数组中最先不连续的数字N

    现在有一大堆自然数组成的小到大数组arr,其中会有123456910  这样就要找到6(最先不连续的数字) 举例:[12356789] 找到3 [012345678] 找到8 第一种:遍历数组判断是否 ...

  6. artTemplate-master的应用

    刚开始,在没有使用这个模板之前,一致都是后台返回一个json的字符串,来在前端自己拼接字符串,不但麻烦,而且费时费力,而且还有时候经常拼接错误!导致了工作效率的延长 js模板的使用 <scrip ...

  7. python strip()函数 介绍

    python strip()函数 介绍,需要的朋友可以参考一下   函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除 ...

  8. 封装jdbc 单例模式的应用

    实现增删该查的jdbc封装 import java.io.IOException; import java.io.InputStream; import java.sql.Connection; im ...

  9. 2016-2-1 Servlet细节

    Servlet的一些细节(韩顺平老师视频讲解)(1)由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序想要被外界访问,必须把servlet程序映射到一个URL地址上.这个工作在 ...

  10. SpringMvc的简单介绍

    1.mcv框架要做哪些事情 (a)将url映射到java类或者Java类的方法 (b)封装用户提交的数据 (c)处理请求---调用相关的业务处理,封装响应的数据 (d)将封装的数据进行渲染,jsp,h ...