题解:

以前看过,思维挺神奇的一道题目

首先可以证明最小割是不能相交的

那么我们就可以找到任意两点求一次最小割然后将割的两边分开来再递归这个过程

另外最小割就是vis=0与vis=1之间的连边

分治的时候把一个局部变量写了全局变量还有83??? 找个好久。。

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 3000
#define INF 1e9
int dis[][],l,n,m,s,t;
struct {
int a,b,c,flow;
}a[maxn*],tmp[maxn*];
bool fz1[],vis[];
int d[],head[];
void arr(int x,int y,int z)
{
a[++l].a=head[x];
a[l].b=y;
a[l].c=z;
a[l].flow=;
head[x]=l;
}
queue<int> q;
bool bfs(){
memset(vis,,sizeof(vis));
queue<int> q;
q.push(s);
d[s]=; vis[s]=;
while (!q.empty())
{
int x=q.front();q.pop();
int u=head[x];
while (u)
{
int v=a[u].b;
if (!vis[v]&&a[u].c>a[u].flow)
{
vis[v]=;
d[v]=d[x]+;
q.push(v);
}
u=a[u].a;
}
}
return(vis[t]);
}
int dfs(int x,int y)
{
if (x==t||y==) return y;
int flow=,f,tmp;
int u=head[x];
while (u)
{
int v=a[u].b;
if (d[x]+==d[v]&&(f=dfs(v,min(y,a[u].c-a[u].flow)))>)
{
a[u].flow+=f;
if (u%) tmp=u+; else tmp=u-;
a[tmp].flow-=f;
flow+=f;
y-=f;
if (y==) break;
}
u=a[u].a;
}
return(flow);
}
int maxflow()
{
int flow=;
while (bfs())
{
flow+=dfs(s,INF);
}
return(flow);
}
void get_ans(int ss,int tt)
{
for (int i=;i<=l;i++) a[i].flow=;
bool tmp3[],fz2[];
s=ss; t=tt;
int ans=maxflow();
memcpy(tmp3,vis,sizeof(vis));
for (int i=;i<=n;i++)
if (vis[i])
for (int j=;j<=n;j++)
if (!vis[j])
dis[i][j]=min(dis[i][j],ans),dis[j][i]=min(ans,dis[j][i]);
int tmp1=,tmp2=,num=;
for (int i=;i<=n;i++)
if (vis[i]&&fz1[i])
{
num++;
if (!tmp1) tmp1=i; else tmp2=i;
}
memcpy(fz2,fz1,sizeof(fz1));
for (int i=;i<=n;i++)
if (!vis[i]) fz1[i]=;
if (num>=)
{
/* l=0; memset(head,0,sizeof(head));
for (int i=1;i<=m;i++)
if (vis[tmp[i].a]&&vis[tmp[i].b]&&
fz1[tmp[i].a]&&fz1[tmp[i].b])
{
arr(tmp[i].a,tmp[i].b,tmp[i].c);
arr(tmp[i].b,tmp[i].a,tmp[i].c);
} */
get_ans(tmp1,tmp2);
}
memcpy(vis,tmp3,sizeof(tmp3));
memcpy(fz1,fz2,sizeof(fz2));
tmp1=,tmp2=,num=;
for (int i=;i<=n;i++)
if (!vis[i]&&fz1[i])
{
num++;
if (!tmp1) tmp1=i; else tmp2=i;
}
for (int i=;i<=n;i++)
if (vis[i]) fz1[i]=;
if (num>=)
{
/* l=0; memset(head,0,sizeof(head));
for (int i=1;i<=m;i++)
if (!vis[tmp[i].a]&&!vis[tmp[i].b]
&& fz1[tmp[i].a]&&fz1[tmp[i].b])
{
arr(tmp[i].a,tmp[i].b,tmp[i].c);
arr(tmp[i].b,tmp[i].a,tmp[i].c);
} */
get_ans(tmp1,tmp2);
}
memcpy(fz1,fz2,sizeof(fz2));
}
int main()
{
std::ios::sync_with_stdio(false);
int T;
cin>>T;
for (int p=;p<=T;p++)
{ l=; memset(head,,sizeof(head));
memset(fz1,,sizeof(fz1));
cin>>n>>m;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) dis[i][j]=INF;
for (int i=;i<=m;i++)
{
int c,d,e;
cin>>c>>d>>e;
tmp[i].a=c; tmp[i].b=d; tmp[i].c=e;
arr(c,d,e); arr(d,c,e);
}
get_ans(,n);
int q;
cin>>q;
int x;
for (int i=;i<=q;i++)
{
cin>>x;
int ans=;
for (int j1=;j1<=n;j1++)
for (int j2=j1+;j2<=n;j2++)
if (dis[j1][j2]<=x||dis[j1][j2]==INF) ans++;
cout<<ans<<endl;
}
cout<<endl; }
return ;
}

[ZJOI2011]最小割的更多相关文章

  1. BZOJ2229: [Zjoi2011]最小割

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

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

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

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

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

  4. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  5. 【BZOJ2229】[Zjoi2011]最小割 最小割树

    [BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...

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

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

  7. [bzoj2229][Zjoi2011]最小割_网络流_最小割树

    最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...

  8. BZOJ2229—— [Zjoi2011]最小割

    0.题目大意:求两点之间的最小割,然后找出其中小于x的数量 1.分析:最小割树水题,上个板子就好 #include <queue> #include <ctime> #incl ...

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

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

  10. ●BOZJ 2229 [Zjoi2011]最小割

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

随机推荐

  1. bzoj千题计划299:bzoj1856: [Scoi2010]字符串

    http://www.lydsy.com/JudgeOnline/problem.php?id=1856 卡特兰数 从(1,1)走到(n,m),不能走y=x 上方的点,求方案数 从(1,1)走到(n, ...

  2. C++ STL sort()函数用法

    C++STL提供的在里的排序函数,有以下两种形式 此外还提供有稳定排序版本stable_sort(),用法类似. 第一种形式: template <class RandomAccessItera ...

  3. Shell结合Expect实现自动输入密码

    Shell结合Expect自动输入密码示例 #!/bin/bash cd /data/live /usr/bin/expect <<-EOF spawn git clone "s ...

  4. FlowLayout OnSizeChanged

    在FlowLayout里加了20个控件,当窗口变化时,改变这20个控件的宽高,结果发现在直接点最大化时, 计算不正确导致自身的滚动条出不来.把改变大小的代码直接添加Form窗口的onSizeChagn ...

  5. Javaweb学习笔记——(七)——————myexlipse基本使用、jdk5.0新特性及反射讲解

    1.debug调试模式: *使用这种模式,调试程序(看到程序运行停止在这一行) -显示出来行号 -双击左边,出现一个圆点,表示设置了一个断点 *使用debug as方式,运行程序 -特使是否进入到调试 ...

  6. mongoDB - 日常操作一

    mongodb 启动方式 # 不启动认证 ./mongod --bind_ip 172.16.2.17 --port --fork --logpath=/opt/mongodb/mongodb.log ...

  7. Netty入门(2) - 核心概念

    Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...

  8. python - class propert应用

    propert应用 #方式一: # class Student(object): # def __init__(self,name,sc): # self.name = name # self.sc ...

  9. Mybatis进阶学习笔记——关系查询——一对一查询

    用户和订单的需求 通过查询订单,查询用户,就是一对一查询 (1)自定义JavaBean(常用,推荐使用) <select id="queryOrderUser" result ...

  10. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...