最小割必割边与二分图关键边
最小割的可能边
对于有向图的有源汇最小割,使用网络流求出最小割后,可能出现在最小割中的边 \(u\to v\) 等价于:
1.满流
2.残量网络上不存在 \(u\to v\) 的路径
首先不满流的边一定不会被割,因为割掉后 新图的流量 \(F'=F-F_{u,v}+\Delta\geq F-F_{u,v}\) 其中 \(F_{u,v}\) 是原先 \(u\to v\) 边的流量,\(\Delta\) 是退流后新增的流量,所以不满流的边有 \(F_{u,v}>V_{u,v}\) 而割掉的贡献是 \(V_{u,v}\),所以割掉后的最小割 \(V_{u,v}+F'>F\) 一定不是最小割。
考虑证明第二条,一条边在最小割中则 \(V_{u,v}+F'=F\),所以要保证 \(\Delta=0\),也就是 原本从源点流向 \(u\) 的边 不能流到 原本从 \(v\) 流向汇点的边,其等价于残量网络上不存在 \(u\to v\) 的路径。因为假设路径由一段被退流的反向边 \(u\to s\) ,一段未满流的路径 \(s->t\) ,一段被退流的反向边 \(t->v\) 构成,则退流后一定存在 \(s\to t\) 的流量;并且若退流后存在新增流量,一定形如这样的 \(s\to t\)。
所以得证。由于残量网络里有 \(v\to u\) 的边,所以这个等价于两者不在残量网络上同一强连通分量内,可以用 tarjan 求解。
这样可能出现的边称为可能边。
最小割的必须边
与可能边的定义类似,必须割的边称作必须边,必须边等价于:
1.满流
2.\(s\) 可达 \(u\) ,\(v\) 可达 \(t\)
仍然考虑上述的割一条可行边并退流的模型,一条边是必须边等价于其不能被任何可行边退流(因为退流了任意值其就不是满流也就不是可行边了)。也就是说经过其的流量一定不经过可行边,所以其中的满流边 \(u'\to v'\) 也一定存在 \(u'\to v'\) 的路径,所以必然存在 \(s\to u\) 的路径和 \(u\to t\) 的路径。必要性考虑不存在这样的路径一定不是必须边,因为其满流所以不存在这样的路径一定在 \(s\to u\) 或 \(v\to t\) 中有满流边,并且其符合可行边条件,与上述推论矛盾。
所以证毕。必须边也等价于 \(u\) 和 \(s\) 在同一强连通分量且 \(v\) 和 \(t\) 在同一强连通分量,也可以使用 tarjan 求解。
二分图的关键边
这个术语也是说必须在匹配里的边,似乎在二分图博弈之类的题中有应用。
直观上,二分图的关键边就应该是网络流建模之后的必割边,但是网络流建立的源点到左部点、右部点到汇点的边是不能割的,不然你的最小割很可能是把源点到左部点的边割光这显然不合理。所以略有区别。
这里有一个 Dulmage–Mendelsohn 分解算法非常的形式化,但是证明十分复杂。
事实上,仍然考虑上述的判断方法,一条左部点到右部点的边 \(u\to v\) 必须被割,当且仅当把经过它的流量退掉之后无法新增流量。而二分图的每个流量都非常简单,都是 源点 \(s\)->左部点 \(u\)->右部点 \(v\)->汇点 \(t\),所以只涉及到三条边。但这时候 \(s\to u\) 和 \(u\to v\) 都是钦定不能割的,所以不能用 \(s\to u\) 存在路径的性质,也就是说这时候可能 \(s\) 不可达 \(u\)。但是完全可以通过暴力的方式判断有没有新的流,退流一共只给 \(s\to u\) 和 \(u\to t\) 加了流量,所以只要残联网络上 \(u\) 不能走到 \(t\),\(s\) 不能走到 \(u\),且 \(u\) 不能走到 \(v\) 就行了。
对应到 Dulmage–Mendelsohn 分解算法的语言,就是一条边 \(e\),在最大匹配中、左部的未匹配点到达不了它的端点、右部的未匹配点反向到达不了它的端点、它不在增广环里。
注意到由于结构的特殊性,原本自明的 \(u\) 到 \(v\) 没路径成为了关键的判别方式,十分神奇。
例题
此题看起来是构造,但是你一看 \(n\le 30\) 以及矩阵一定是方阵,觉得事情并不简单。
事实上此题要用图论来考虑,把 \(n\) 行视为左部点,\(n\) 列视为右部点,一开始的 \(A\) 矩阵其中 \(a_{i,j}\) 为 \(1\) 的部分视作一条匹配边。限制每个左部点能匹配的数量是这行的和,每个右部点能匹配的数量是这列的和,则 \(A\) 对应着一组最大匹配。同时,每个 \(B\) 也对应一组最大匹配,所以固定的位置数就是一定在匹配中的边,即关键边数。
具体地,这个题的二分图是完全二分图,每条边可以自由定向,求不在同一强连通分量里的边有多少。
类似竞赛图,完全二分图的强连通分量分解也差不多是链。如果一个强连通分量里有超过一个点,那必然有左部点也有右部点,所以它到其它任何强连通分量都有边;但两个各只有一个点的强连通分量之间可能没有边。不妨转换思路,求在同一强连通分量里的边数,这样就可以忽略只有一个点的强连通分量们,直接 dp 每次加入一个强连通分量即可。
#include<bits/stdc++.h>
using namespace std;
int mp[35][35][905],ans[905];
int main()
{
int n,q,x;cin>>n>>q;
mp[0][0][0]=1;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
{
for(int k=0;k<=n*n;k++)
if(mp[i][j][k])
{
ans[k]=1;
for(int t1=2;t1<=n-i;t1++)
for(int t2=2;t2<=n-j;t2++)
mp[i+t1][j+t2][k+t1*t2]=1;
}
}
while(q--)
{
scanf("%d",&x);
if(ans[n*n-x]) puts("Yes");
else puts("No");
}
return 0;
}

浙公网安备 33010602011771号