网络流学习笔记(未完成)
知识点后面再补。
本文可能对于部分题目没有时间复杂度或证明,若看到了可以提醒我一下,有错欢迎指出,当然也欢迎催更。
大部分题目选自 command_block 的 网络流/二分图相关笔记(应用篇)。题单后面再整理。
符号的约定
边默认为有向边。
\(S\):源点。
\(\mathbb{S}\):从 \(S\) 出发,不经过边权为 \(w\) 的边所能达到的点集。
\(T\):汇点。
\(\mathbb{T}\):从 \(T\) 出发,不经过边权为 \(w\) 的边所能到达的点集。
\(V\):点集。
\(E\):边集。
\(cut\):最小割。
\((u,v)\):\(u\to v\) 的边。
\((u,v,w)\):\(u\to v\) 的权为 \(w\) 的边。
\((u,v,[low,upp])\):\(u\to v\) 的权在 \([low,upp]\) 之间的边。
\((u,v,w,c)\):\(u\to v\) 的权为 \(w\) 且费用为 \(c\) 的边。
\((u,v,[low,upp],c)\):\(u\to v\) 的权在 \([low,upp]\) 之间的费用为 \(c\) 的边。
\(flow\):最大流。
\(cost\):最小/大费用。
最大流建模
二分图最大匹配
首先二分图的最大匹配是可以用最大流解决的。考虑建立虚拟源汇 \(S,T\),\(S\) 连向左侧点,右侧点连向 \(T\),边权均为 \(1\)。然后再把原图上所有的 \(u\to v\) 的边赋一个 \(+\infty\) 即可。Dinic 跑二分图最大匹配的时间复杂度是 \(\mathcal{O}(m\sqrt{n})\)。证明还不会/lh。
最大权闭合子图
闭合子图定义:选出点带权(\(a_i \in \mathbb{R}\))最大的有向图子图 \(V'\)(\(V'\) 可以为空),且满足 \(\nexists (u,v)\in E,u\in V',v\notin V'\)。
考虑最小割。
先说建模方式:建立虚拟源汇 \(S,T\),\(S\) 连向所有正权点,边权为 \(a_i\)。所有负权点连向 \(T\),边权为 \(|a_i|\)。然后将所有原图中的边赋为 \(+\infty\)。
则此时的权为:
但是这个建模方式为什么是对的呢?
将已割的负权点和未割的正权点记作 \(A\)。这里的割/未割指的是连向源/汇的边有没有被割。
先证明这个东西是闭合子图。如果 \(A\) 不是闭合子图,则可能指向已割的正权点或未割的负权点。指向负权点则肯定还要割。指向正权点的话,因为该点在原图上连出去所能到达的负权点的点集中,一定有没有被割掉的(否则就不用割掉这个正权点了),所以就不会指向已割的正权点(否则还需再割)。
权是 正权点的权和-割 是因为割掉的正权点不在 \(A\) 中,割掉的负权点在 \(A\) 中,但连向 \(T\) 的权是反的。然后求的是最大权,所以就要求最小割了。
还不知道这种建模方法是怎么想到的呢/gg