题解:

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

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

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

另外最小割就是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. JavaScript常用函数总结

    1.test()方法 var str = "wzltestreg"; var reg = new RegExp("wzl", ""); al ...

  2. C# 时间戳与时间相互转化

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 时间戳d ...

  3. JavaScript之函数存储[摘]

    引用文献:js忍者秘籍 var store = {//demo:函数存储----存储一组独立的函数 nextId:1, cache:{}, add:function(fn){ if(!fn.id){ ...

  4. JavaScript之正方教务系统自动化教评[插件-转载]

    [声明]本插件系学院学长原创,非博主所创,发布此处,仅供学习和效仿. /** * @name:正方教务系统自动化教评-插件 * * @author:chenzhongshu * @date:2017- ...

  5. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  6. Spring源码学习资料

    未完待续.. github地址 https://github.com/spring-projects 学习地址 https://github.com/code4craft/tiny-spring 推荐 ...

  7. cetus系列~安装和基本配置

    cetus系列一 安装   1 安装软件环境   yum install cmake gcc glib2-devel flex mysql-devel gperftools-libs  bison f ...

  8. mysql 查询优化~sql优化通用

    一 简介:今天我们来探讨下SQL语句的优化基础 二 基础规则: 一 通用: 1 避免索引字段使用函数     2 避免发生隐式转换     3 order by字段需要走索引,否则会发生filesor ...

  9. js代码解析原则

    js引擎在读取js代码时会进行两个步骤,第一个步骤是解释,第二个步骤是执行. 解释就是先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是执行代码的操作. 例: 例子1: < ...

  10. SharePoint 2013 Workflow Manager 1.0 远程服务器返回错误: (400) 错误的请求。 不支持查询字符串中的 api-version

    环境: Windows Server 2012 R2 Standard SharePoint Server 2013 with sp1 通过Web 平台安装程序 5.0,已安装 Workflow Ma ...