Description

小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。 对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割” 现给定一张无向图,小白有若干个形如“图中有多少对点它们的最小割的容量不超过x呢”的疑问,小蓝虽然很想回答这些问题,但小蓝最近忙着挖木块,于是作为仍然是小蓝的好友,你又有任务了。

解题报告

对于最小割,其实本质不同的只有n-1个,考虑怎么找出这n-1个

可以简单证明:最小割不会相交,可以简单的用反证法证明

考虑一个四格矩形1,2,3,4四个区域(象限),分割线分别为A,B,C,D。

假设1,4的最小割为(A,C) 2,3的最小割为(B,D),那么可以推出 \(A<B\),\(C<D\),所以2,3的最小割不为 (A,C) 产生矛盾,固不相交.

既然不相交,考虑每次找出本质不同的,因为不相交,所以可以考虑分治.

找出当前层的最小割,化为S,T两个集合,然后再选择S,T集合分别做同样的操作,因为最小割不相交,所以找出的一定不同,对于一个点对,在每一个最小割里取Min即可

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=155,inf=2e9,M=3005;
int id[N],n,m,b[N],head[N],nxt[M<<1],to[M<<1],dis[M<<1],num=1,a[N][N],T,S;
void link(int x,int y,int z){nxt[++num]=head[x];to[num]=y;dis[num]=z;head[x]=num;}
void addedge(int x,int y,int z){link(x,y,z);link(y,x,z);}
struct edge{int x,y,dis;}e[M];
int q[N],dep[N];
il bool bfs(){
int x,u,t=0,sum=1;
memset(dep,0,sizeof(dep));
dep[S]=1;q[1]=S;
while(t!=sum){
x=q[++t];
for(int i=head[x];i;i=nxt[i]){
u=to[i];if(dep[u] || dis[i]<=0)continue;
dep[u]=dep[x]+1;q[++sum]=u;
}
}
return dep[T];
}
il int dfs(int x,int flow){
if(x==T || !flow)return flow;
RG int u,tot=0,tmp;
for(int i=head[x];i;i=nxt[i]){
u=to[i];
if(dis[i]<=0 || dep[u]!=dep[x]+1)continue;
tmp=dfs(u,Min(flow,dis[i]));
dis[i]-=tmp;dis[i^1]+=tmp;
tot+=tmp;flow-=tmp;
if(!flow)break;
}
if(!tot)dep[x]=-1;
return tot;
}
il int maxflow(int ss,int tt){
S=ss;T=tt;int tot=0,tmp;
while(bfs()){
tmp=dfs(S,inf);
while(tmp)tot+=tmp,tmp=dfs(S,inf);
}
return tot;
}
void Clear(){memset(head,0,sizeof(head));num=1;}
il void solve(int l,int r){
if(!(l^r))return ;
int L=l,R=r;
Clear();
for(RG int i=1;i<=m;i++)
addedge(e[i].x,e[i].y,e[i].dis);
int tmp=maxflow(id[l],id[r]);
for(int i=1;i<=n;i++)
if(dep[i])for(RG int j=1;j<=n;j++)if(!dep[j])a[i][j]=a[j][i]=Min(a[i][j],tmp);
for(int i=l;i<=r;i++){
if(dep[id[i]])b[L++]=id[i];
else b[R--]=id[i];
}
for(int i=l;i<=r;i++)id[i]=b[i];
solve(l,R);solve(L,r);
}
void work()
{
Clear();
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
e[i].x=x;e[i].y=y;e[i].dis=z;
}
for(int i=1;i<=n;i++)
for(RG int j=i+1;j<=n;j++)
a[i][j]=a[j][i]=inf;
for(int i=1;i<=n;i++)id[i]=i;
solve(1,n);
int Q;cin>>Q;
while(Q--){
scanf("%d",&x);
int ans=0;
for(int i=1;i<=n;i++)
for(RG int j=i+1;j<=n;j++)
if(a[i][j]<=x)ans++;
printf("%d\n",ans);
}
} int main()
{
int T;cin>>T;
while(T--){
work();
if(T)puts("");
}
return 0;
}

bzoj 2229: [Zjoi2011]最小割的更多相关文章

  1. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

  2. BZOJ.2229.[ZJOI2011]最小割(最小割树)

    题目链接 题意:给定一张无向图,求任意两点之间的最小割. 在所有点中任选两个点作为源点\(S\).汇点\(T\),求它们之间的最小割\(ans\),并把原图分成两个点集\(S',T'\),用\(ans ...

  3. bzoj 2229: [Zjoi2011]最小割【Gomory–Hu tree最小割树】

    这个算法详见http://www.cnblogs.com/lokiii/p/8191573.html 求出两两之间最小割之后暴力统计即可 #include<iostream> #inclu ...

  4. ●BOZJ 2229 [Zjoi2011]最小割

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2229 题解: 首先先去看看这个博客:http://blog.csdn.net/jyxjyx2 ...

  5. 2229: [Zjoi2011]最小割(最小割树)

    Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中 ...

  6. bzoj千题计划139:bzoj2229: [Zjoi2011]最小割

    http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...

  7. BZOJ2229: [Zjoi2011]最小割

    题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...

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

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

  9. 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)

    [BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...

随机推荐

  1. 团队作业4——第一次项目冲刺(Alpha版本)11.14

    a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: PM对整个项目的需求进行讲解: 全队对整个项目的细节进行沟通: 对整个项目的开发计划进行分析,分配每天的任务: 统一确定项目的开发环境 ...

  2. java第5章学习总结

    学号20145336 <Java程序设计>第5周学习总结 教材学习内容总结 try catch JVM会先尝试执行try区块中的内容,若发生错误且与catch后面的类型相符,则执行catc ...

  3. Cypher语法

    cypher是neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤,我们知识图谱的一期项目 基本开发完毕,后面会陆续总结学习一下neo4j相关的知识.今天接着上篇文章来看 ...

  4. [USACO4.1]麦香牛块Beef McNuggets

    https://www.luogu.org/problemnew/show/P2737 给出n个数ai,求这n个数不能累加出的最大的数 最大的数无限大或能凑出所有的自然数则输出0 n<=10,a ...

  5. JAVA_SE基础——41.instanceof关键字(运算符)

    instanceof 关键字 instanceof关键字的作用:判断一个对象是否属于指定的类别. instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系.关于实现以后 ...

  6. Collaborative Filtering(协同过滤)算法详解

    基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...

  7. 安装 go 语言环境

    操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 安装go 这里直接安装二进制,其它方式请自行搜索. 1.下载并安装go 命令如下: ? 1 2 3 wget https://st ...

  8. Codeforces 343D WaterTree - 线段树, DFS序

    Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...

  9. Django小范围傻瓜总结

    1.母版: layout.html {% block x %}{% endblock %} 2.子版: {% extends 'layout' %} {% block x %}.......{% en ...

  10. Nginx配置特定二级域名

    首先把先在域名设置页面把二级域名解析到服务器的公网IP上,这里假设是 bbs.domainname.com 然后编辑 /etc/nginx/sites-available/domain.com.con ...