平面图转对偶图的应用

平面图转对偶图是解决某些问题的有效方法,特别是当数据范围较大时。通过对平面图转换为对偶图,可以降低网络流的复杂度。在平面图中,每个面的度数等于对偶图中对应点的度数。对于极大平面图,不存在割点和桥。在实际操作中,将网格图分为两部分,并确定连边规则,例如对于有向边,可以顺时针旋转90度。在编码实现上,可以通过特定方式标识面来简化问题,如本题中使用顶点编号来区分面。
摘要由CSDN通过智能技术生成

平面图转对偶图

[BeiJing2006]狼抓兔子

这个是经典题,显然就是求一个最小割。然后网络流建立无向图即可。

但是如果数据范围没有那么小呢?

众所周知网络流的复杂度其实挺玄学的,而且这又是一张平面图,不妨将其转化为对偶图。


定义:

平面图:任意两条边不相交的图。

面的次数:边界的长度,用 d e g ( R i ) deg(R_i) deg(Ri) 表示。

:几阶就是几个点。

对偶图:本质上就是从平面图的面相互连边。

性质:

1:平面图的面数量等于对偶图点数量,对偶图面数量等于平面图点数量。

2:对偶图一个面的度数是围绕其一周走的边数。

hlTiYF.png

显然这张图中间这个面由 7 7 7 条边围成,所以其度数是 7 7 7

极大平面图:如果 G G G 是简单平面图,而且任意两个点之间加一条新编所得到的图为非平面图,则 G G G 是极大平面图。

  • 必定联通
  • 任意阶数 ≥ 3 \ge 3 3 的极大平面图中不可能存在割点和桥。

其实后面还有很多定理,就稍微放一下,之后有能力了再补。


两种图互相转换本质上就是讲两个面进行连边而已。

为了方便我们需要将整个网格图划分成两半分别属于 S , T S, T S,T。之后只需要跑 S → T S \to T ST 的最短路即可。

注意:

至于连边方面,如果是无向边那显然没事。如果是有向边考虑顺时针旋转 90 90 90 度,这个是以右上角为 S S S 的情况。

对于一个面我们不妨钦定一个表示法,对于普通的网格图可以使用左上角。

但是像这种图,我们不妨考虑是最上角点的编号 × 2 \times 2 ×2,然后根据最后一位是否为 1 1 1 来区分一个 4 4 4 联通块中的两个面。

本题的代码:

#include <bits/stdc++.h>
using namespace std;

//#define Fread
//#define Getmod

#ifdef Fread
char buf[1 << 21], *iS, *iT;
#define gc() (iS == iT ? (iT = (iS = buf) + fread (buf, 1, 1 << 21, stdin), (iS == iT ? EOF : *iS ++)) : *iS ++)
#define getchar gc
#endif // Fread

template <typename T>
void r1(T &x) {
   
	x = 0;
	char c(getchar());
	int f(1);
	for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
	for(; '0' <= c && c <= '9';c = getchar()) x = (x * 10) + (c ^ 48);
	x *= f;
}

template <typename T,typename... Args> inline void r1(T& t, Args&... args) {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值