问题描述
很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁。随着喜马拉雅山海拔逐渐增加,两个地区的交流也越来越少,最终没有了来往。
假设当时的地形和我画的一样,蓝色部分代表海洋,而且当时人们还没有发明轮船。黄色部分代表沙漠,而且沙漠上经常有野鬼散步,所以人们不敢到沙漠中行走。黑色的格子表示山峰,这些山峰都无比高大,所以人无法穿过。白色格子代表平原,人可以在平原上自由行走。人每次可以向相邻的四个格子走动。

此外,我们的考古学家发现还有一些山峰会逐渐形成,通过研究发现,位置在 (x, y)(x,y) (保证该位置之前没有山峰)的地方在 ii 年后出现了山峰。现在给你若干个位置出现山峰的时间,你可以计算出中国和印度之间的联系最早被彻底切断的时间吗?
输入描述
多组测试数据, 第一行为组数T(T\leq 10)T(T≤10)。每组测试数据第一行包含两个数 N, M (1 \leq N, M \leq 500)N,M(1≤N,M≤500), 表示地图的大小。接下来 NN 行长度为 MM 的 0101 字符串。00代表白色格子,11 代表山峰。接下来有 Q(1\leq Q \leq N\times M)Q(1≤Q≤N×M) 行,第 i(1\leq i \leq Q)i(1≤i≤Q) 两个整数 (x,y),0 \leq x < N, 0 \leq y < M(x,y),0≤x<N,0≤y<M 表示在第 ii 年 (x,y)(x,y) 出现了一座山峰。
输出描述
对于每组测试数据,输出一个数, 表示两国最早失联的时间。如果最终两国之间还有联系则输出 -1。
输入样例
1
4 6
011010
000010
100001
001000
7
0 3
1 5
1 3
0 0
1 2
2 4
2 1
输出样例
4

这是一个连通性的问题。你会发现如果将所有操作逆序来看的话就很容易用并查集来处理了。 首先把所有的山峰都加到图中,然后逆序处理每个操作: 对某次操作,在图中删除该位置的山峰,然后判断两个点是否联通,一旦联通就得到了结果。 这里需要对China和India分别新建一个对应的节点。

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;const int N = 510;
int n, m;
char G[N][N];
int dirx[] = {1, -1, 0, 0};
int diry[] = {0, 0, 1, -1};
vector <int> X;
vector <int> Y;
int p[N * N];int findpa(int x)
{if (p[x] == x) return x;else return p[x] = findpa(p[x]);
}void link(int a, int b)
{int fa = findpa(a);int fb = findpa(b);if (fa != fb) p[fa] = fb;
}int main()
{int T;scanf("%d", &T);while (T--){scanf("%d%d", &n, &m);X.clear();Y.clear();for (int i = 0; i < n; i++)scanf("%s", G[i]);int s = 0, t = n * m + 1;for (int i = s; i <= t; i++) p[i] = i;for (int i = 0; i < m; i++){link(s, i + 1);link(t, n * m - i);}int q, x, y;scanf("%d", &q);for (int i = 0; i < q; i++){scanf("%d%d", &x, &y);X.push_back(x);Y.push_back(y);G[x][y] = '1';}for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)for (int k = 0; k < 4; k++){int x = i + dirx[k];int y = j + diry[k];if (x >= 0 && x < n && y >= 0 && y < m && G[i][j] == '0' && G[x][y] == '0')link(i * m + j + 1, x * m + y + 1);}if (findpa(s) == findpa(t)){printf("-1\n");continue;}int flag = 0;for (int i = q - 1; i >= 0; i--){int x = X[i], y = Y[i];G[x][y] = '0';for (int k = 0; k < 4; k++){int nx = x + dirx[k];int ny = y + diry[k];if (nx < n && nx >= 0 && ny < m && ny >= 0 && G[nx][ny] == '0')link(x * m + y + 1, nx * m + ny + 1);}if (findpa(s) == findpa(t)){flag = 1;printf("%d\n", i + 1);break;}}if (!flag) printf("0\n");}return 0;
}

hdu 5652 India and China Origins 并查集相关推荐

  1. HDU 5652 India and China Origins(二分 + BFS)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html 题意: 中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表 ...

  2. hdu5652:India and China Origins(并查集)

    倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...

  3. HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  5. HDU 3047 Zjnu Stadium (带权并查集)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3047 题目: Problem Description In 12th Zhejiang College ...

  6. hdu 1272 小希的迷宫 (并查集)

    小希的迷宫                                                                          Time Limit: 2000/1000 ...

  7. HDU 1325 Is It A Tree? 并查集

    点击打开链接 Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  8. HDU 3081 Marriage Match II【并查集+二分图最大匹配】

    大意:有n个男孩n个女孩,告诉你每个女孩喜欢哪些男孩,又告诉你女孩之间的存在一些朋友关系 一个女孩可以和她喜欢的男孩结婚也可以和她朋友喜欢的男孩结婚, 并且朋友关系可以传递 Once every gi ...

  9. HDU - 5176 The Experience of Love(并查集)

    题目链接:点击查看 题目大意:给出一棵边权树,现在要求任意两点之间:最大权值的边减去最小权值的边之和 题目分析:第一步可以先将公式转换一下:,这样问题就转换为了如何求任意两点之间的最大(最小)权值之和 ...

  10. HDU - 3081 Marriage Match II(二分+并查集+最大流/匈牙利删边)

    题目链接:点击查看 题目大意:n个男生和n个女生配对,配对规则如下: 每个女生都可以选择没有吵过架的男生匹配 若女生A的好朋友是女生B,且女生B没有和男生C吵过架,则女生A也可以和男生C匹配 现在问最 ...

最新文章

  1. Php中的强制转换详解
  2. Android创建文件为unix格式,Recovery模式下/cache/recovery/目录下创建文件,开机后文件被删除...
  3. erlang精要(7)-模块
  4. 【Python】用 Python 来实现PDF 的各种操作(附网站和操作指导)
  5. 割平面法只能求解纯整数规划吗_【DMC第四讲】整数规划
  6. Tomcat服务器启动错误之Offending class: javax/servlet/Servlet.class
  7. Jquery中如何获取元素的文本,值,属性和内容
  8. c# 自定义应用程序配置文件(app.config)
  9. trie树和后缀树的应用
  10. (34)Gulp 构建HTML页面文件
  11. css样式(二)(伪类 | 伪元素 | 导航 | 图像拼合 | 属性选择器 )
  12. JavaScript的可变参数介绍
  13. 别人推荐的一首好听的歌
  14. xcodebuild命令行打包发布ipa
  15. ML for trading -cs7646-01
  16. 正版cs跳跃服务器,反恐精英 玩CS1.6跳跃服务器
  17. Unity用代码将多张图片合并为一张图片
  18. 快递面单打印报错:“print selected is not valid” 解决方案
  19. python爬取网页数据总结_python之爬取网页数据总结(一)
  20. 《软件工程之美》打卡第四周,2021最新Android面试真题解析

热门文章

  1. Xcode iOS开发:UIKit常用组件之按钮控件
  2. 马尔科夫蒙特卡罗方法
  3. Mac部分按键失灵问题解决
  4. Restorator软件使exe文件都不能打开,任务管理器不支持此接口
  5. mac安装win10_老笔记本加装1T固态硬盘,顺便安装win10 Mac双系统,真香
  6. python调用高德api路径规划_Python调用高德API爬取异地驾驶距离
  7. Sybase在线手册
  8. Windows批处理bat文件
  9. 个人web前段学习心得
  10. python的logo的代码_简单几步,100行代码用Python画一个蝙蝠侠的logo