题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=2229

题解:

首先先去看看这个博客:http://blog.csdn.net/jyxjyx27/article/details/42750833
非常不错的,可以对最小割树有一个简单的感性认识。

由于求最小割树感觉很麻烦,并且本题的点数的数据规模不大,
所以就不需要构造出最小割树,只需要求出所有的 ans[i][j]:i->j的最小割。
即采用分治,求出 n-1个最小割,
并在每次求完最小割后,尝试更新不同集合的点之间的 ans即可。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 200
#define MAXM 7000
#define INF 0x3f3f3f3f
#define filein(x) freopen(#x".in","r",stdin);
#define fileout(x) freopen(#x".out","w",stdout);
using namespace std;
struct Edge{
int to[MAXM],cap[MAXM],next[MAXM],head[MAXN],ent;
void Init(){
ent=2; memset(head,0,sizeof(head));
}
void Adde(int u,int v,int w){
to[ent]=v; cap[ent]=w; next[ent]=head[u]; head[u]=ent++;
to[ent]=u; cap[ent]=0; next[ent]=head[v]; head[v]=ent++;
}
void reset(){
for(int i=2;i<ent;i+=2){
cap[i]=cap[i^1]=(cap[i]+cap[i^1])/2;
}
}
}E;
bool mark[MAXN];
int a[MAXN],cur[MAXN],d[MAXN],ans[MAXN][MAXN];
int N,M,Q;
bool bfs(int S,int T){
static queue<int> q; int u,v;
memset(d,0,sizeof(d));
d[S]=1; q.push(S);
while(!q.empty()){
u=q.front(); q.pop();
for(int i=E.head[u];i;i=E.next[i]){
v=E.to[i];
if(d[v]||!E.cap[i]) continue;
d[v]=d[u]+1; q.push(v);
}
}
return d[T];
}
int dfs(int u,int reflow,const int &T){
if(u==T||!reflow) return reflow;
int flowout=0,f,v;
for(int &i=cur[u];i;i=E.next[i]){
v=E.to[i];
if(d[v]!=d[u]+1) continue;
f=dfs(v,min(reflow,E.cap[i]),T);
flowout+=f; E.cap[i^1]+=f;
reflow-=f; E.cap[i]-=f;
if(!reflow) break;
}
if(!flowout) d[u]=0;
return flowout;
}
int Dinic(int S,int T){
int flow=0;
while(bfs(S,T)){
memcpy(cur,E.head,sizeof(E.head));
flow+=dfs(S,INF,T);
}
return flow;
}
void dfs(int u){
mark[u]=1;
for(int i=E.head[u];i;i=E.next[i])
if(!mark[E.to[i]]&&E.cap[i]) dfs(E.to[i]);
}
void Partition(int l,int r){
static int tmp[MAXN],S,T,cut;
if(l>=r) return;
E.reset(); S=a[l]; T=a[r];
cut=Dinic(S,T);
memset(mark,0,sizeof(mark)); dfs(S);
for(int i=1;i<=N;i++)
for(int j=1;j<i;j++) if(mark[a[i]]^mark[a[j]])
ans[a[i]][a[j]]=ans[a[j]][a[i]]=min(ans[a[i]][a[j]],cut);
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<L;i++) a[i]=tmp[i];
for(int i=r;i>R;i--) a[i]=tmp[i];
Partition(l,L-1);
Partition(R+1,r);
}
int main()
{
filein(mincut); fileout(mincut);
int T; scanf("%d",&T);
while(T--){
E.Init();
memset(ans,0x3f,sizeof(ans));
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++) a[i]=i;
for(int i=1,u,v,w;i<=M;i++){
scanf("%d%d%d",&u,&v,&w);
E.Adde(u,v,2*w);
}
E.reset(); Partition(1,N);
scanf("%d",&Q);
for(int k=1,c,num;k<=Q;k++){
scanf("%d",&c); num=0;
for(int i=1;i<=N;i++)
for(int j=1;j<i;j++)
if(ans[i][j]<=c) num++;
printf("%d\n",num);
}
puts("");
} return 0;
}

●BOZJ 2229 [Zjoi2011]最小割的更多相关文章

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

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

  2. bzoj 2229: [Zjoi2011]最小割

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

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

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

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

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

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

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

  6. BZOJ2229: [Zjoi2011]最小割

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

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

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

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

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

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

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

随机推荐

  1. Alpha冲刺Day11

    Alpha冲刺Day11 一:站立式会议 今日安排: 由周静平继续完成昨日第三方机构剩余的核实企业风险数据和企业风险数据详情模块 由张梨贤和黄腾飞共同完成第三方机构的分级统计展示模块 由林静开始登录/ ...

  2. 2018上C语言程序设计(高级)作业- 第2次作业

    作业要求一 提交截图: 6-7: 6-8: 6-9: 7-1: 作业要求二 题目6-7删除字符中数字字符 1.设计思路: (1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到 ...

  3. 2017 清北济南考前刷题Day 3 afternoon

    期望得分:100+40+100=240 实际得分:100+40+100=240 将每个联通块的贡献乘起来就是答案 如果一个联通块的边数>点数 ,那么无解 如果边数=点数,那么贡献是 2 如果边数 ...

  4. github感悟

    刚学GitHub进入网页全英文的,感觉很惊讶,自己竟然要在全英文的网站上学习,虽然是英文的但并不感觉有压力,可能之前用eclipse就是全英文的现在除了惊讶,没太多的想法.然后就是我的GitHub地址 ...

  5. Linux入门:usermod - 修改用户帐户信息

    一.什么是usermod? usermod 命令通过修改系统帐户文件来修改用户账户信息usermod [options] user_name选项(options)-a|--append ##把用户追加 ...

  6. Linux进程管理:后台启动进程和任务管理命令

    一.为什么要使程序在后台执行 我们的应用有时候要运行时间很长,如:几个小时甚至几个星期,我们可以让程序在后台一直跑. 让程序在后台运行的好处有: 终端关机不影响后台进程的运行.(不会终端一关机或者网络 ...

  7. 开源软件:NoSql数据库 - 图数据库 Neo4j

    转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...

  8. OAuth2.0学习(1-3)OAuth2.0的参与者和流程

    OAuth(开放授权)是一个开放标准.允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息.而这种授权无需将用户提供用户名和密码提供给该第三方网站. OAuth允许用户提供一个令牌给第 ...

  9. less规范

    Less 编码规范 (1.1) 简介 该文档主要的设计目标是提高 Less 文档的团队一致性与可维护性. Less 代码的基本规范和原则与 CSS 编码规范 保持一致. 编撰 吕俊涛 本文档由商业运营 ...

  10. Java-Maven(二):Maven常用命令

    Maven命令简介 Maven提供了一套命令可以用来创建java工程.编译.打包等操作.通过这些命令来处理工作变得更方便.简洁. Maven工程结构和内容被定义在pom.xml文件中,全称projec ...