BZOJ2229: [Zjoi2011]最小割(最小割树)
最小割树
算法
初始时把所有点放在一个集合
从中任选两个点出来跑原图中的最小割
然后按照 \(s\) 集合与 \(t\) 集合的归属把当前集合划分成两个集合,递归处理
这样一共跑了 \(n − 1\) 次最小割
可以证明图中任意一对点之间的最小割的数值都包含在这 \(n − 1\) 个数值当中
把每次求出的最小割看成是两个点之间的边,可以建出一棵树
定理1
任意三点之间的最小割一定是两个相等的较小值和一个较大值
证明
设任意三点 \(a, b, c\) 之间的最小割分别为 \(mincut(a, b), mincut(a, c), mincut(b, c)\)
设 \(mincut(a, b)\) 是这三者中的最小值
那么在做 \(a − b\) 割时,\(c\) 一定属于其中的某一个集合,设其与 \(a\) 同属于一个集合
那么就有 \(mincut(b, c) \le mincut(a, b)\)
又因为 \(mincut(a, b) \le mincut(b, c)\),所以两者相等
定理2
图中至多只有 \(n − 1\) 种不同的最小割
证明
编了一个构造的证明
首先根据定理 \(1\) ,可以转化成如下问题:
\(n\) 个点的无向完全图,要给每一条边染色,要求每个三元环上有两条边同色,求最多可以染多少种颜色
考虑归纳法
假设现在已经有一条长度大于 \(1\) 的链 \(a\) 到 \(b\) 上的边的颜色互不相同
考虑染 \((a,b)\) 这条边
如果链长 \(=2\),那么 \((a,b)\) 只能选择链上某条边的颜色
如果链长 \(>2\),假设两个端点在链上的不是 \((a,b)\) 的边的颜色都是链上某条边的颜色
那么取出其中两条 \((a,c)\) 和 \((c,b)\),\((a,b)\) 只能选择两个中其中一条边的颜色,即链上某条边的颜色
所以可以得到,颜色互不相同的边不能形成环,所以最优的显然是树,即 \(n-1\) 中颜色
Sol
至此问题已经完美解决
建出最小割树,任意两个点的最小割就是路径边权最小值
直接暴力也可以
复杂度貌似 \(\Theta(n^3m)\) \(???\)
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn(505);
const int inf(1e9);
int first[maxn], n, m, cnt, lev[maxn], vis[maxn], s, t, id[maxn], tmp[maxn], cur[maxn], mincut[maxn][maxn], record[maxn << 4];
queue <int> q;
struct Edge {
int to, next, w;
} edge[maxn << 4];
inline void Add(int u, int v, int w) {
edge[cnt] = (Edge){v, first[u], w}, first[u] = cnt++;
edge[cnt] = (Edge){u, first[v], w}, first[v] = cnt++;
record[cnt - 1] = record[cnt - 2] = w;
}
inline int Bfs() {
memset(lev, 0, sizeof(lev)), lev[s] = 1, q.push(s);
register int u, e, v;
while (!q.empty()) {
for (u = q.front(), q.pop(), e = first[u]; ~e; e = edge[e].next)
if (edge[e].w && !lev[v = edge[e].to]) lev[v] = lev[u] + 1, q.push(v);
}
return lev[t];
}
int Dfs(int u, int maxf) {
if (u == t) return maxf;
register int ret = 0, &e = cur[u], f, v;
for (; ~e; e = edge[e].next)
if (edge[e].w && lev[v = edge[e].to] == lev[u] + 1){
f = Dfs(v, min(edge[e].w, maxf - ret));
ret += f, edge[e].w -= f, edge[e ^ 1].w += f;
if (ret == maxf) return ret;
}
if (!ret) lev[u] = 0;
return ret;
}
inline int Dinic() {
register int ret = 0, i;
for (i = 0; i < cnt; ++i) edge[i].w = record[i];
while (Bfs()) memcpy(cur, first, sizeof(cur)), ret += Dfs(s, inf);
return ret;
}
void Mark(int u) {
if (vis[u]) return;
register int e;
for (vis[u] = 1, e = first[u]; ~e; e = edge[e].next) if (edge[e].w) Mark(edge[e].to);
}
inline void Solve(int l, int r) {
if (l >= r) return;
memset(vis, 0, sizeof(vis)), s = id[l], t = id[r];
register int i, j, mid, d = Dinic();
for (Mark(s), j = 0, i = l; i <= r; ++i) if (vis[id[i]]) tmp[++j] = id[i];
for (mid = l + j - 1, i = l; i <= r; ++i) if (!vis[id[i]]) tmp[++j] = id[i];
for (i = l; i <= r; ++i) id[i] = tmp[i - l + 1];
for (i = 1; i <= n; ++i)
if (vis[i])
for (j = 1; j <= n; ++j)
if (i != j && !vis[j]) mincut[i][j] = mincut[j][i] = min(mincut[i][j], d);
Solve(l, mid), Solve(mid + 1, r);
}
int main() {
register int i, j, u, v, w, test;
scanf("%d", &test);
while (test--) {
memset(first, -1, sizeof(first)), cnt = 0;
scanf("%d%d", &n, &m);
for (i = 1; i <= m; ++i) scanf("%d%d%d", &u, &v, &w), Add(u, v, w);
for (i = 1; i <= n; ++i) id[i] = i;
memset(mincut, 63, sizeof(mincut)), Solve(1, n), scanf("%d", &w);
while (w--) {
scanf("%d", &u), v = 0;
for (i = 1; i <= n; ++i)
for (j = i + 1; j <= n; ++j) v += mincut[i][j] <= u;
printf("%d\n", v);
}
putchar('\n');
}
return 0;
}
参考文献
- 某鸽姓选手的网络流课件
2. 垃圾博主自己yy
BZOJ2229: [Zjoi2011]最小割(最小割树)的更多相关文章
- [bzoj2229][Zjoi2011]最小割_网络流_最小割树
最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- scu - 3254 - Rain and Fgj(最小点权割)
题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- 【BZOJ2229】[Zjoi2011]最小割 最小割树
[BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
- 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)
思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...
随机推荐
- CentOS7基础建站指南(笔记)
由于前段时间腾讯云打折,所以买了一台小服务器,想着以后写几个小网站,博客什么的,但是一开始就遇到了难题,大概就是Linux服务器的配置问题,比如如何假设服务器,配置非root用户,配置服务器数据的非r ...
- vue环境搭建简介
简单整理下vue的安装的新建项目 安装node.js和npm 参考其他教程 安装vue npm install vue 安装脚手架 vue-cli npm install --global vue-c ...
- jsp页面用struts2标签展示List<Object>类型的数据
今天遇到一个问题,一个List<Object>类型的数据,是直接从sql查出来的数据,要在前端展示,原来的方法不知道为什么不能展示,后来找了好久,找到了一个靠谱的方法,记录一下 <s ...
- SPOJ Lexicographical Substring Search 求字典序第k大子串 后缀自动机
题目传送门 思路:按字典序,小的字符优先选取.对于一个字符,如果以这个字符开头的子串大于等于k个,那说明这个字符是应该选的,并且选完之后,可能还要继续选.如果以这个字符开头的子串小于k个,说明这个字符 ...
- Spring Boot Starter列表
转自:http://blog.sina.com.cn/s/blog_798f713f0102wiy5.html Spring Boot Starter 基本的一共有43种,具体如下: 1)spring ...
- java回调方法之理解
以前经常看见"回调方法(或回调函数)"一词,但是没有了解过是什么意思,更不知道用法.现在从网络上搜集了一些很好的资料,自己又整理一下,作为自己的笔记,也作为学习过程中的一个小脚印. ...
- 设置获取用户登录信息的Seeion类
/** * * 保存用户上下文信息 * 还可以获取session * */ public class UserContext { public static final String USER_IN_ ...
- python四种简单排序
#!/usr/bin/python #排序方法 #冒泡排序 def buble(l): for i in range(len(l)): for j in range(len(l)-i-1): if l ...
- 入门系列之在Ubuntu 14.04上备份,还原和迁移MongoDB数据库
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 MongoDB是最受欢迎的NoSQL数据库引擎之一.它以可扩展,强大,可靠和易于使用而闻名.在本文中,我们 ...
- 一个简单好用的强制删除软件geek
给大家推荐geek软件工具,一个可以用来强制卸载那些常规手段无法卸载的软件,到官网(https://geekuninstaller.com/download)下载免费版,运行软件后,选择需要强制删除软 ...