网络流杂题

luogu P4313 文理分科

​ 题意:给定一个 \(n \cdot m\) 的网格,将网格黑白染色。每个点有被染成黑色或白色后的权值,同时也有相邻的(指有一条相同的边)的点和自己相同全都被染成黑色或白色后的权值,要求最大化权值和。

\(n,m<=100\)


经典最小割模型,一个点被割到 \(S\)\(T\) 表示被染成某一种颜色。每个点先和 \(S\)\(T\) 连边,然后每个点再和其相邻的点连一条容量为 \(INF\) 的边,表示永远不会被割开,然后用总权值减去最小割即可。

CF704D Captain America

​ 题意:二维平面上有 \(n\) 个点,每个点的坐标为 \((x_i,y_i)\) 。每个点都要被涂为红色或蓝色,价格分别为 \(r\)\(b\)

。同时还有 \(m\) 个限制,有两种:\(1 \,l \,d\) 表示在直线 \(x=l\) 上两种颜色的点的数量之差不超过 \(d\)\(2 \, l\,d\) 表示在直线 \(y=l\) 上两种颜色的点的数量之差不超过 \(d\)。要求构造出一种涂色方案且总花费最少,或判断无法构造。

\(n,m<=1e5 \;\; x_i,y_i<=1e9\)


先对坐标离散化一下。对于二维平面上的点 \((x_i,y_i)\) ,经典做法是将 \(x\)\(y\) 拆开,当成左部点和右部点,分别向 \(S\)\(T\) 连边。我们先假设 \(r<=b\) ,涂红我们就可以看作 \(x\)\(y\) 有流。假设一条直线上有 \(a\) 个点,且这条直线要求数量之差为 \(d\),那么这条直线上红点的数量在 \([\,max(0,\lceil{\frac{a-d}{2}}\rceil)\;,\;min(a,\lfloor{\frac{a+d}{2}}\rfloor)\,]\) 之间(解个方程就能得到),即流量有上下界,且要求红点的数量尽可能多,那么我们直接跑一个有源汇有上下界最大流,就能得到红点的数量,剩下的就是蓝点,至此费用就算出来了。对于构造方案,我们遍历每个点对应的那一条边,若它被流过(即反向边上有流量),说明被涂成了红色,否则蓝色。

无解的情况也好判断,一是有某条直线,其上界比下界还大;或者有源汇有上下界最大流本身无解。

luogu P2071 座位安排

​ 题意:有 \(2n\) 个人和 \(n\) 个座位,每个座位只能坐 \(2\) 人,且每个人都有自己想坐的座位,问最多多少人可以做到自己想坐的座位。

\(n<=2000\)


裸题。将人和座位匹配,\(S\) 向座位连容量是 \(1\) 的边,每个人向 \(T\) 连容量为 \(2\) 的边,每个座位向对应的人连容量为 \(1\) 的边,然后跑最大流即可。

luogu P4043[AHOI2014/JSOI2014]支线剧情

​ 题意:给定一个 \(n\) 个点的 \(DAG\) 有边权。从 \(1\) 号点出发,到达一个点可以选择继续走,也可以选择直接回到 \(1\) 号点重新开始,这个操作不需要代价。求要经过所有边的最小边权和。

\(n\le 300\)


考虑每条边的边权可以看成走这条边的费用,走的次数就可以看成流量,所以直接建图。\(S\)\(1\) 号点连边,因为每条边都要至少走一次,所以考虑上下界网络流,将其下界设为 \(1\),上界为 \(INF\) 。同时因为可以从除 \(1\) 以外的任意点结束,所以将除 \(1\) 以外的点向 \(T\) 连边,然后跑有源汇有上下界最小费用可行流。与上下界可行流类似,只需要最后算上每条边费用乘下界即可。

CF843E Maximum Flow

​ 题意:给定一个网络流图,每条边的容量未知,同时有一个隐藏的最大流方案。每条边有 \(g_i\) ,若 \(g_i=0\) 表示这条边无流量流过,若 \(g_i=1\) 表示有流量。要求最小化满流的边的数量,同时输出这种条件下每条边的流量与容量。

\(2\le n\le 100\;\; 1\le m\le 1000\)


考虑到最小割上的边一定是满流的,所以我们要求边数最少的最小割。对于 \(g_i=0\) ,我们连边 \((u,v,INF)\) ,因为这条边没有流,就一定能从 \(u\) 走到 \(v\) ,那么它们就不能割掉。对于 \(g_i=1\) ,因为这条边有流量,所以其反向边一定有流量。同理,若没有满流,那么 \(u\) 可以到 \(v\) 。若满流,就可以加入到最小割中。所以我们连边 \((u,v,1),(v,u,INF)\) 。然后我们跑一个 \(S\)\(T\) 的最小割即可。

然后我们考虑怎么构造方案。对于 \(g_i=1\) 的边,其流量就有了下界 \(1\) ,那我们跑上下界可行流即可。对于 \(g_i=0\) 的边,其容量可设为 \(INF\) ,流量为 \(0\) 。对于 \(g_i=1\) 的边,最终这条边的流量就是得到的可行流(记得加下界 \(1\) )。同时若这条边在最小割中,其容量要与流量相等,表示满流。否则容量设为 \(INF\) 即可。

posted @ 2023-03-19 21:26  YC乌龙  阅读(82)  评论(3编辑  收藏  举报