[BZOJ 4423] Bytehattan 平面图与对偶图

题意

  给定一个 $n \times n$ 的点阵, 形成一个网格图.

  最初的时候四连通.

  $m$ 次操作, 每次删去一条边 $(u, v)$ , 问 $u$ 和 $v$ 是否仍然连通.

  $2 \le n \le 1500, 1 \le m \le 2n(n - 1)$ .

分析

  将平面图转化为它的对偶图.

  每次相当于将两个平面区域合并.

  对于删去一条边, 若与它相邻的两个区域连通, 那么操作后两个点中有一个点被区域包围, 一个点被隔在了外面, 所以不连通, 反之仍然连通.

实现

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cctype>
 5 #define F(i, a, b) for (register int i = (a); i <= (b); i++)
 6 inline int rd(void) {
 7     int f = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -1;
 8     int x = 0; for (; isdigit(c); c = getchar()) x = x*10+c-‘0‘; return x*f;
 9 }
10 inline char rdc(void) { char c = getchar(); while (!isalpha(c)) c = getchar(); return c; }
11
12 const int N = 2500000;
13
14 int n, m, f[N];
15 inline int id(int x, int y) {
16     bool Legal = (1 <= x && x < n && 1 <= y && y < n);
17     return Legal ? (x-1)*(n-1)+y : 0;
18 }
19 inline int Find(int x) { return f[x] == x ? x : f[x] = Find(f[x]); }
20 inline bool Union(int x, int y) {
21     int fx = Find(x);
22     int fy = Find(y);
23     bool ret = (fx != fy);
24     return f[fx] = fy, ret;
25 }
26
27 int main(void) {
28     #ifndef ONLINE_JUDGE
29         freopen("bzoj4423.in", "r", stdin);
30     #endif
31
32     n = rd(), m = rd();
33     F(i, 0, (n-1)*(n-1)) f[i] = i;
34
35     bool Last = true;
36     F(i, 1, m) {
37         int a = rd(), b = rd(); char c = rdc();
38         int _a = rd(), _b = rd(); char _c = rdc();
39         if (!Last) a = _a, b = _b, c = _c;
40         if (c == ‘N‘)
41             Last = Union(id(a, b), id(a-1, b));
42         else Last = Union(id(a, b), id(a, b-1));
43         puts(Last ? "TAK" : "NIE");
44     }
45
46     return 0;
47 }

  

时间: 2024-10-25 14:34:53

[BZOJ 4423] Bytehattan 平面图与对偶图的相关文章

BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树

4541: [Hnoi2016]矿区 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 433  Solved: 182[Submit][Status][Discuss] Description 平面上的矿区划分成了若干个开发区域.简单地说,你可以将矿区看成一张连通的平面图,平面图划分为了若 干平面块,每个平面块即为一个开发区域,平面块之间的边界必定由若干整点(坐标值为整数的点)和连接这些整点 的线段组成.每个开发区域的矿量与该开发区域的面积有关:具

bzoj 4423: [AMPPZ2013]Bytehattan

Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数. 接下来k行,每行包含两条信息,每条信息包含两个正整数a,b(1<=a,b<=n)以及一个字符c(c=N或者E). 如果c=N,表示删除(a,b)到(a,b+1)这

BZOJ 2965 保护古迹 平面图转对偶图+最小割

题目大意:给出一个平面图,这个平面图中分布着一些点,可以用平面图中的边将一些点围住,问围住k个点的最小花费是多少. 思路:这题重点是平面图转对偶图.做法不难理解.先将所有的边拆成两条,枚举所有的边,若这个边没有被标记过,那么就对这条边进行搜索,弄出来以这个边为一边的平面区域,可以顺时针或者逆时针.将所有边挂在这条边的起点上,在所有点上按照每条边的极角排序,每次找的时候找大于(或小于)当前边的反向边的第一条边作为搜索的下一条边.直到回到最开始的点.找边的过程中记录面积,判断面积的正负来判断这个平面

【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status][Discuss] Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主

【BZOJ2965】保护古迹 平面图转对偶图,暴力,网络流

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43199045"); } 题意:自己看去吧. 题解:如果不考虑这道题的某些小数据范围, 那么正解应该是: 首先平面图转对偶图, 然后扫描线处理名胜古迹 过程中运用到邪恶的平衡树(就算是set也依然恶心) 或者用神奇方法Ⅰ判断(cheat)一个名胜古迹在

平面图与对偶图

平面图就是能在平面上画出来, 且所有边仅在顶点处相交的图. 对于一个平面图, 我们按照下面方式定义它的对偶图: 将每个平面区域建立一个节点. 对于原图中的每条边, 将与它相邻的两个平面区域对应的节点连边. 点定位: 确定平面中的某个点在哪个区域. 举个例子来说: 对于平面图转化为对偶图, 很多时候图都是方方正正的网格图, 可以方便地进行标号. 但是至于平面图与对偶图的一般转化, 我还不大会, 可以看一下 miskcoo 的博客 . orz GEOTCBRL,  WC 2013 平面图 1A .

bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普] 设有平面图G=(V,E),满足下列条件的图G'= (V',E') 称为图G的对偶图:G的任一面Ri内有且仅有一点Vi':对G的域Ri和Rj的共同边界Ek,画一条边Ek'=(Vi',Vj')且只与Ek交于一点:若Ek完全处于Ri中,则Vi'有一自环Ek',如下图G'是G的对偶图: From her

BZOJ 4423 【AMPPZ2013】 Bytehattan

Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一行包含两个正整数n,k(2<=n<=1500,1<=k<=2n(n-1)),表示网格图的大小以及操作的个数. 接下来k行,每行包含两条信息,每条信息包含两个正整数a,b(1<=a,b<=n)以及一个字符c(c=N或者E). 如果c=N,表示删除(a,b)到(a,b+1)这

BZOJ 1001狼抓兔子 对偶图+SPFA

这道题是求图的最小割,也就是用最大流.但因为边太多,最大流算法会T,因此不能用最大流算法. 因为这是个平面图,所以求平面图的最小割可以使用特殊的技巧就是求对偶图然后求对偶图的最短路.把每个面看成一个点f*,f*之间边的权值就是之前原来的点f之间与f*的边交叉的边的权值.(说的不清楚,大家可以看其他博客,讲得都很好) 这样建了一个对偶图G*,由此可见,对偶图G*的一条路对应着原图G的一个割.所以求G*的最短路就相当于求G的最小割. 以后遇到平面图求最小割就把它转化成对偶图再求最短路,这样时间效率会