[ZJOI2011]最小割
题解:
以前看过,思维挺神奇的一道题目
首先可以证明最小割是不能相交的
那么我们就可以找到任意两点求一次最小割然后将割的两边分开来再递归这个过程
另外最小割就是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]最小割的更多相关文章
- BZOJ2229: [Zjoi2011]最小割
题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- bzoj千题计划139:bzoj2229: [Zjoi2011]最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...
- [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割
题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...
- 【BZOJ2229】[Zjoi2011]最小割 最小割树
[BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- [bzoj2229][Zjoi2011]最小割_网络流_最小割树
最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...
- BZOJ2229—— [Zjoi2011]最小割
0.题目大意:求两点之间的最小割,然后找出其中小于x的数量 1.分析:最小割树水题,上个板子就好 #include <queue> #include <ctime> #incl ...
- bzoj 2229 [Zjoi2011]最小割(分治+最小割)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...
- ●BOZJ 2229 [Zjoi2011]最小割
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2229 题解: 首先先去看看这个博客:http://blog.csdn.net/jyxjyx2 ...
随机推荐
- PHP 将amr音频文件转换为mp3格式
说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3.在网页端使用HTML5的audio标签来 ...
- ms sqlserver2008r2 自动备份
日常工作中利用SQL SQLSERVER 2008 的维护计划对数据库进行定期的备份,这样一方面可以对数据库进行备份保证数据安全另一方面也可以减轻对维护人员的负担. 一般对于WEB 服务器进 行维护都 ...
- CF1009E [Intercity Travelling]
这道题先考虑一种暴力n方做法 设\(f_i\)表示到\(i\)点所有情况的困难度之和(\(f_0=0\)),\(pre_i=\sum_{j=1}^{i} a_j\) 考虑从点\(j\)中途不经过休息站 ...
- Ubuntu16.04搭建QingdaoU(docker一键式部署)
QDUOJ已经开源到2.0版本了,下面的教程不再适用,仅做纪念吧! 这几天装什么Linux.开源OJ上瘾了...竟然没去刷题...嗯,做好记录就写题啦! 先上原始网站的图: 风格不错,很符合我的口味. ...
- 一个极好的JavaScript学习网址
JavaScript学习网址:https://javascript.info/ 网址界面如下,内容和排版都非常不错,内容也比较新,不像一些教程已经是好几年前的了.把这个教程浏览一遍,能够解答很多看代码 ...
- day2 查看文件目录命令:ls
查看当前文件夹下面多有的目录文件ls 查看当前目录下面所有的文件,包括隐藏的文件ls -a(或者两个一样ls -all) 显示除"."和".."外的所有文件ls ...
- 利用QT、QWebview、ffmpeg实现的屏幕录制方案
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- python - class类 (四) 三大特性之一 :继承
继承: #继承 #什么时候用继承? # 1.当类之间有显著的不同,并且较小的类是较大的类的所需的组建时,用组合比较好. # 2.当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好 # ...
- dubbo系列四、dubbo服务暴露过程源码解析
一.代码准备 1.示例代码 参考dubbo系列二.dubbo+zookeeper+dubboadmin分布式服务框架搭建(windows平台) 2.简单了解下spring自定义标签 https://w ...
- windows系统下安装tomcat及配置
1.安装测试 1.安装 推荐使用免安装版的Tomcat(放在没有中文和空格的目录下),前提是已经安装了JDK并配置了环境变量. 2.测试 双击startup.bat,浏览器输入url:localhos ...