Problem 1
题目链接:BZOJ4423: [AMPPZ2013] Bytehattan
Description
给一张n × m的网格图,每次删去一条边,询问删完之后这条边的
两个端点是否联通。
Solution
对偶图 + 并查集。
对偶图: 是将这个平面的每个区域看成点,原图每一条边所属的两个相邻的区域对应在对偶图中的点有连边。比如下面这张图:
蓝色的部分就是一个平面图,红色的就是它的对偶图。
回到这道题:
由于强制在线,不能时光倒流+加边。那么可以考虑对偶图。
对于每条线段挨着的两个面积块,如果它们之间是连通的,那么删除这条线段后这两个面积块会在一个环中,且这个环包含且只包含两个端点中的一个(即一个点在环里,一个点在环外),则原图即为不能连通。反过来也成立。
所以只需要把平面图删边转化为对偶图加边就可以了。然后用并查集维护一下连通性即可。
也就是说,在平面图上删边相当于在对偶图上加边,在平面图上是否联通转化为在对偶图上是否不连通,类似于平面图的最大流转化为对偶图的最短路。
Code
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define fi first
#define se second
#define mst(a, b) me