平面图最小割与对偶图最短路

Posted llmmkk 的尘歌壶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了平面图最小割与对偶图最短路相关的知识,希望对你有一定的参考价值。

平面图

平面图就是所有边都不相交的图,如

看起来相交了,但实际上没有相交,和下图等价,就是一个平面图


对偶图

对偶图是伴随平面图的一张图,

具体来说就是把原来平面图里的每个面当做一个节点

这些节点之间的边是和原图的边相交的,对偶图边权值等于原平面图边的权值

具体地:
设平面图为 \\(G\\),对偶图为 \\(G\'\\),对于原图中每条边 \\(e\\)

  1. \\(e\\) 属于两个平面 \\(f1,f2\\),则在对偶图中连边 \\((f1\',f2\')\\)
  2. \\(e\\) 属于一个平面 \\(f1\\),则在对偶图中连自环 \\((f1\',f1\')\\)

如:

如果单独把对偶图抽出来就是:


平面图最小割与对偶图最短路

在一类问题中我们常常会遇到网格图,并需要使用最小割算法,如[NOI2010] 海拔[ICPC-Beijing 2006]狼抓兔子以及[CSP-S 2021] 交通规划,这些题的节点数可能非常多,导致 Dinic 太慢过不去,然后网格图正是一张典型的平面图,所以可以把平面图最小割转换成对偶图最短路。

可以看国集论文“周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》”。

也就是说,平面图的最小割就是对偶图的最短路,所以我们在平面图上使用做最小割时,可以先构造出原图的对偶图,然后跑最短路即可,这样显然会比网络流快。

对于对偶图上的起点和终点,假如有这样一张网格图:

显然它的最小割一定是上下,上左,左右,左下这几种情况,也就是这样四种

所以我们就可以把最外面的平面当成两个,上和右当做起点点,左和下当做终点,

就可以建出这样的对偶图。

然后在实际的题目中会有一些方向的问题,可以自己画画对偶图找找规律啥的。


实际技巧

这里存一个网格图建对偶图的有用的东西,

一个 \\(n=3\\)\\(n*n\\) 的网格图,

规定这样记对偶图的点

这样记平面图的横边

这样记平面图的竖边

其实就是首先从上到下,其次从左到右编号,

那么可以这样找平面图的边在对偶图中对应的 \\((u,v)\\)

inline int up(int i){
	if(i<=n)return s;
	return i-n;
}
inline int down(int i){
	if(i>n*n)return t;
	return i;
}
inline int left(int i){
	if(i%(n+1)==1)return t;
	return i-(i-1)/(n+1)-1;
}
inline int right(int i){
	if(i%(n+1)==0)return s;
	return i-i/(n+1);
}

updown 用来找平面图横边,leftrignt 用来找平面图竖边。

边的方向问题:

原平面图中\\(S\\) 流向 \\(T\\) 的边,在对偶图中也\\(S\\) 流向 \\(T\\),具体可以参考 海拔 的代码

海拔的编号方法就是上面的方法。


以上是关于平面图最小割与对偶图最短路的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 3035 War(对偶图求最小割+最短路)

平面图最小割 对偶图

BZOJ1001: [BeiJing2006]狼抓兔子

bzoj一句话题解

BZOJ2007[Noi2010]海拔 对偶图最短路

bzoj1001--最大流转最短路