近期看了一些bzoj的网络流,深感智商不够。不过对于网络流又有了进一步的理解。

还是mark一下吧。

献上几篇论文:1)《最小割模型在信息学竞赛中的应用》

2)《浅析一类最小割问题》

1、bzoj1066(最大流)

题意:戳这里

思路:很明显拆点最大流模型,然后对于每个点每个高度流量限为1,那么根据最大流即为可以出去的蜥蜴的数量。

2、bzoj1077(费用流)

戳这里

3.bzoj1391(最小割)

题意:戳这里

思路:有点像最大权闭合图。。可以利用最小割的性质建图:

<S,任务,收益>

<机器,T,购买费用>,<任务,机器,租用费用>

这样,如果与T相连的边为割,表示购买机器花费更小。

如果与S相连的边为割,表示任务花费太大,不做任务更优(收益为0)。

如果<任务,机器>边为割,表示任务花费太大,不做任务更优(收益为0)。

最后总收益-最大流即为答案

4、bzoj1412(最小割)

题意:有一些格子里是狼,一些里是羊,一些是空的,要使狼和羊的格子不相通,至少要堵多少条边界。

思路:很明显的最小割

5、bzoj1433(二分图匹配)

题意:戳这里

思路:需要床位的为一边,提供床位的为一边,认识连一条边(包括自己跟自己),然后就是一个二分图最大匹配。

6、bzoj1475(最大点独立集)

题意:戳这里

思路:Amber论文里讲到的题目,很明显可以看出是个二分图模型。。

但是不容易看出是求最大点权独立集。那么构图就很显然了。

7、bzoj1497(最大密度子图)

题意:戳这里

思路:可以转化成最小割。具体看Amber论文。

8、bzoj1520(费用流)

题意:戳这里

思路:很明显的最小费用流

9、bzoj1532(最大流+二分)

题意:戳这里

思路:二分最大分数score,那么

<S,人,score>,<人,比赛,1>,<比赛,T,1>

判断流量flow = m

10、bzoj1565(tarjan+最大权闭合图)

题意:戳这里

思路:首先先把保护关系建立有向边,那么如果出现环的话,环里面的所有点,包括他能保护得点都不能取。。

那么剩下的图再进行最大权闭合图的构图

code:

 #include <bits/stdc++.h>
using namespace std;
#define M0(a) memset(a, 0, sizeof(a))
#define Inf 0x3fffffff
const int maxn = ;
const int maxm = ;
struct oo{
int y, f, next;
};
struct MaxFlow{
int n, S, T, tot;
int son[maxn], dist[maxn], gap[maxn];
oo e[maxm];
int sap(int x, int aug){
if (x == T) return aug;
int mind = n;
int sum = , f;
for (int p = son[x]; p != -; p = e[p].next){
int y = e[p].y;
if (dist[y] + == dist[x] && e[p].f){
f = sap(y, min(e[p].f, aug - sum));
e[p].f -= f;
e[p^].f += f;
sum += f;
if (sum == aug || dist[S] >= n) return sum;
}
if (e[p].f) mind = min(mind, dist[y]);
}
if (!sum){
if (!(--gap[dist[x]])) dist[S] = n;
++gap[dist[x] = mind + ];
}
return sum;
}
void add(int x, int y, int f){
e[tot].y = y; e[tot].f = f;
e[tot].next = son[x]; son[x] = tot++;
e[tot].y = x; e[tot].f = ;
e[tot].next = son[y]; son[y] = tot++;
} void init(int S, int T, int n){
memset(son, -, sizeof(son));
tot = ;
this->S = S, this->T = T, this->n = n;
}
int maxflow(){
M0(gap);
M0(dist);
gap[] = n;
int ans = ;
while (dist[S] < n) ans += sap(S, Inf);
return ans;
}
} F;
vector<int> e[maxn];
int n, m, sum;
int score[][], use[ * ], vis[ * ];
//vector<pair<int, int> > pre[35][35];
void init(){
for (int i = ; i <= n * m; ++i)
e[i].clear();
// for (int i = 0; i <= n; ++i)
// for ()
int k, x, y;
int cur = ;
for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j){
scanf("%d%d", &score[i][j], &k);
++cur;
while (k--){
scanf("%d%d", &x, &y);
e[cur].push_back(x*m+y+);
}
if (j > ) e[cur].push_back(cur-);
} }
/*** tarjan-begin ***/
int top, Index, dfn[maxn], low[maxn], stk[maxn], col[maxn], cnt;
bool insta[maxn];
vector<int> co[maxn];
void tarjan(int u){
dfn[u] = low[u] = ++Index;
stk[++top] = u;
insta[u] = true;
int v;
for (int i = ; i < (int)e[u].size(); ++i){
v = e[u][i];
if (!dfn[v]){
tarjan(v);
low[u] = min(low[v], low[u]);
}
else if (insta[v]) low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]){
++cnt;
while (){
col[stk[top]] = cnt;
insta[stk[top]] = false;
if (stk[top--] == u) break;
}
}
} void tarjan(){
M0(dfn), M0(low), M0(insta), M0(col);
top = cnt = Index = ;
for (int i = ; i <= n*m; ++i)
if (!dfn[i]) tarjan(i);
for (int i = ; i <= n * m; ++i)
co[i].clear();
for (int i = ; i <= n * m; ++i)
co[col[i]].push_back(i);
}
/***tarjan-end ***/ void dfs(const int u){
if (vis[u]) return;
vis[u] = ;
for (int i = ; i < (int)e[u].size(); ++i)
dfs(e[u][i]);
} void solve(){
tarjan();
M0(use);
for (int i = ; i <= cnt; ++i)
if ((int)co[i].size() > ){
for (int j = ; j < (int)co[i].size(); ++j)
use[co[i][j]] = ;
}
M0(vis);
for (int i = ; i <= n * m; ++i)
if (use[i] && !vis[i]) dfs(i);
int S = , T = n *m + ;
F.init(S, T, T + );
int cur = sum = ;
for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j){
++cur;
if (vis[cur]) continue;
if (score[i][j] >= )
F.add(S, cur, score[i][j]), sum += score[i][j];
else
F.add(cur, T, -score[i][j]);
for (int k = ; k < (int)e[cur].size(); ++k)
F.add(e[cur][k], cur, Inf);
}
int ans = sum - F.maxflow();
printf("%d\n", ans);
} int main(){
// freopen("a.in", "r", stdin);
while (scanf("%d%d", &n, &m) != EOF){
init();
solve();
}
}

11、bzoj1585(最小割)

题意:戳这里

思路:

拆点最小割,保证每个点流量为1

<S, 1, INF>

提到的点x : <x', T, INF>

对于每个点x,为1或是提到的点: <x,x',INF>

对于每个点x,不为1且不是提到的点:<x,x',1>

对于原图每条边x->y: <x', y, INF>和 <y', x, INF>

最大流即为答案。。

ps..这一题跟usaco原题改动有点大。。害我做原题时进坑了。。

12、bzoj1711(最大流)

题意:戳这里

思路:三分图匹配,记得中间那个点要拆点限流量为1

13、bzoj1741(最小点覆盖)

题意:戳这里

思路:把行列抽象出来成为一个二分图,有小行星就连一条边。那么题目就等价与求出最小的点覆盖所有的遍。

14、bzoj1779(拆点最大流)

题意:戳这里

思路:好像还不是很理解。。过后补上。

15、bzoj1797(最小割+tarjan)

题意:戳这里

思路:首先跑一边最大流。然后在残余图中进行tarjan缩点。

那么对于所有满流边:

如果连接S,T两个强联通分量,那么一定是在最小割里。

如果连接两个不同的强联通分量,可能出现在最小割里。

16、bzoj1822(二分+最大流)

题意:戳这里

思路:二分时间t,那么就可以算出在这个时间内每个巫妖可以攻击的数目。

然后建图:

<S,  巫妖, 可攻击数目>,<巫妖,可攻击到的小精灵, 1>,<小精灵, T , 1>

最后判断最大流是否为小精灵个数

比较麻烦的是判断巫妖是否攻击到小精灵,需要一点计算几何知识。

17、bzoj1834(网络流模板)

题意:戳这里

思路:<S, 1, K>, 先跑一边最大流,然后在残余网络的每条边加上一条流量Inf费用为扩容费用的边

18、bzoj1877(最小费用最大流)

题意:戳这里

思路:拆点,然后就是经典构图了

19、bzoj1927(最小费用最大流)

戳这里

20、bzoj1934(最小割)

题意:戳这里

思路:分集合很典型的最小割的应用

最初选择睡午觉 <S, i, 1>

最初选择不睡午觉 <i, T, 1>

i与j为好友, <i, j, 1> <j, i, 1>

最小割即为答案。。这应该是pty大神论文最简单的应用吧

21、bzoj1937(二分图最大权匹配问题)

题意:戳这里

思路:把所有边分为树边与非树边,那么对于费树边i,连接u,v

权值wi>=wj(所有u,v路径上的边j),所以非树边只有可能变大,树边只有可能变小

即,对于非树边i即路径上的任意树边j:

wi + di >= wj - dj

=> di + dj >= wj - wi

wj-wi为定值,那么等式几乎就跟最大权匹配的顶标的式子一样了。。

套用最大权匹配km算法。。

本来想用费用流,一想到边很多就怂了。。

22、bzoj2039(最小割)

戳这里

23、bzoj2127(最小割)

题意:戳这里

思路:可利用二元关系建图:

<S, A, w1/2>,<A, T, w2/2>

<S, B, w1/2> , <B,T,w2/2>,

<A, B, (w1+w2)/2>, <B, A, (w1 + w2)/2>

为防止出现小数,可将所有流量都流量*2,最后/2即可。

答案即为sum(喜悦值)- flow

未完待续。。。

bzoj网络流的更多相关文章

  1. 网络流系列算法总结(bzoj 3438 1061)

    网络流嘛,怎么看都是一堆逗逼题嘛,反正遇到还是都做不起嘛.... 网络流的模板非常简单,难点都在于建图,网络流的建图解决问题范围之广,下至A+B Problem,上至单纯形,线性规划.所以如果对于网络 ...

  2. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

  3. POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)

    POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...

  4. BZOJ 1565 [NOI2009]植物大战僵尸 | 网络流

    传送门 BZOJ 1565 题解 这道题也是个经典的最大权闭合子图-- 复习一下最大权闭合子图是什么? 就是一个DAG上,每个点有个或正或负的点权,有的点依赖于另外一些点(如果选这个点,则被依赖点必选 ...

  5. BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图

    链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...

  6. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  7. bzoj 2406: 矩阵 上下界网络流判定

    2406: 矩阵 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 46[Submit][Status][Discuss] De ...

  8. Bzoj 1532: [POI2005]Kos-Dicing 二分,网络流

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1373  Solved: 444[Submit][St ...

  9. 网络流(二分):BZOJ 3993: [SDOI2015]星际战争

    Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈 地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型 ...

随机推荐

  1. win10安装.net3.5

    近日有网友反映在windows10_64位系统电脑上安装Net framework3.5,操作时总失败,怎么办呢?小编下面就介绍win10 64位系统无法安装Net framework3.5的两种解决 ...

  2. De novo RNA-Seq Assembly Using De Bruijn Graphs

    De novo RNA-Seq Assembly Using De Bruijn Graphs  2017-06-12 09:42:47     59     0     0 在说基因组的拼接之前,可 ...

  3. 201621123008 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  4. Mybatlis SQL 注入与防范

    SQL注射原理 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...

  5. 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。

    <form action="flow_myTaskList"> <input type="hidden" name="approva ...

  6. robotframework 运行集合

    Robot Framework 运行测试通过 pybot 命令,检查 _C:\Python36\Scripts_ 目录下是否有 pybot.bat 文件,正确安装 Robot Framework 一定 ...

  7. Netsharp下微信菜单以及OAuth

    一.OAuth介绍 在微信开发中,当打开一个页面是,业务场景一般会基于粉丝绑定用户信息,即页面需要基于粉丝和用户的身份处理业务逻辑. 在微信中打开一个页面有三个场景: 1.文本回复中直接包含url 2 ...

  8. Java中TreeMap的基本操作

    TreeSet有四种种构造函数可以初始化 在代码中主要列出了常用的三种: 构造方法摘要 TreeSet()           构造一个新的空 set,该 set 根据其元素的自然顺序进行排序. Tr ...

  9. spring学习 十 schema-based 异常通知,和环绕通知

    一 schema-based异常通知 第一步:创建通知类 :新建一个类实现 throwsAdvice 接口,throwsAdvice接口只是标记接口里面并没有任何方法,必须自己写方法,且必须叫 aft ...

  10. linux_磁盘挂载

    mount -o loop 磁盘的位置 想要挂载的位置 磁盘卸载 umont 挂载的磁盘的详细位置 注意:磁盘卸载时你当前所在的路径不要在磁盘挂载的路径,应该其他与磁盘挂载路径不相干的路径下即可