[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 ...
随机推荐
- eclipse导入项目后找不到.class文件
今天从git上clone代码到eclipse中,发现项目->右键没有java build path选项,而且src下没有包路径,都显示成文件夹. 发现项目中没有.class文件 后来发现项目-& ...
- QDoubleSpinBox浮点型数字调节框
样式: import sys from PyQt5.QtWidgets import QApplication, QWidget, QDoubleSpinBox class Demo(QWidget) ...
- 2017CCPC秦皇岛 E题String of CCPC&&ZOJ3985【模拟】
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985 题意: 给定一个字符串,由c和p组成,可以添加c或者p. 串中出现一 ...
- 【BUG】xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence
来自http://blog.csdn.net/chenyanbo/article/details/6866941 xml读取异常Invalid byte 1 of 1-byte UTF-8 seque ...
- block循环引用
block里边会有循环引用的风险,它可能对外部一个变量出现强引用,所以需要判断里边是否有循环引用,通过dealloc方法(销毁当前控制器.或销毁要测试的变量),判断是否循环引用.主要在block 里边 ...
- 解决kali linux 开启ssh服务后连接不上的问题
今天在手机端装了NetHunter 想连接PC的kali ,可是怎么都连不上 综合网友的经验: 1.修改sshd_config文件,命令为:vi /etc/ssh/sshd_config 将#Pass ...
- .NET CORE 1.1 迁移到.NET 2.0正式版
以下操作参考官方文档 1:首先你需要升级到最新版的VS 2017 15.3 升级的地方在VS右上角有个黄色的更新提醒,如果没有请挂VPN或者重新下载一个新的. 2:第二步 和之前改.NET Frame ...
- S5PV210串口
串口设置之输入输出字符 S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它 ...
- 通用jsonp跨域技术获取天气数据
1. 前言 在进行网站开发的过程中经常会用到第三方的数据,但是由于同源策略的限制导致ajax不能发送请求,因此也无法获得数据.解决ajax的跨域问题可以使用jsonp技术 2.代码 <!DOCT ...
- 转:Session,Token相关区别
参考地址:https://www.cnblogs.com/xiaozhang2014/p/7750200.html 1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为htt ...