博客
关于我
【并查集】【环】jzoj3809. 【NOIP2014模拟8.25】设备塔
阅读量:362 次
发布时间:2019-03-04

本文共 2670 字,大约阅读时间需要 8 分钟。

为了解决这个问题,我们需要确保在改造设备塔的区块时,不会断开数据通道,使得设备塔的两端无法连通。我们可以使用并查集(Union-Find)数据结构来高效地管理各个区块的连通性。

方法思路

  • 初始化并查集:每个区块初始时不与任何其他区块连通。
  • 处理每个操作:对于每个要改造的区块,检查该区块及其周围八个相邻区块中的改造区块。
  • 判断连通性:如果在这些区块中存在至少一个连通到圆柱体两端的区块,那么这个操作是可行的。
  • 执行操作:将相关区块标记为改造,并更新并查集。
  • 统计可行操作:统计所有可行操作的数量。
  • 解决代码

    #include 
    int n, m, k;int fx[8] = { -2*m-1, -2*m, -2*m+1, -1, 1, 2*m-1, 2*m, 2*m+1 };int B[200001] = {0};int f[200001];int find(int d) { if (f[d] == 0 || f[d] == d) return d; return f[d] = find(f[d]);}int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= k; ++i) { int a, b; scanf("%d%d", &a, &b); int l1bh = (a-1) * 2 * m + b; int l2bh = l1bh + m; int pd = 0; for (int ii = 0; ii < 8 && pd == 0; ++ii) { int bh1 = l1bh + fx[ii]; if ((l1bh - 1) % (2 * m) == 0) { if (ii == 0) bh1 = l1bh - 1; if (ii == 3) bh1 = l1bh + 2 * m - 1; if (ii == 5) bh1 = l1bh + 4 * m - 1; } if (bh1 > 0 && bh1 <= 2 * n * m) { if (B[bh1] == 1) { for (int j = 0; j < 8; ++j) { int bh2 = l2bh + fx[j]; if (l2bh % (2 * m) == 0) { if (j == 2) bh2 = l2bh - 4 * m + 1; if (j == 4) bh2 = l2bh - 2 * m + 1; if (j == 7) bh2 = l2bh + 1; } if (bh2 > 0 && bh2 <= 2 * n * m) { if (B[bh2] == 1) { if (find(bh1) == find(bh2)) { pd = 1; break; } } } } } } } if (pd == 0) { ++Ans; B[l1bh] = B[l2bh] = 1; for (int j = 0; j < 8; ++j) { int bh1 = l1bh + fx[j]; if ((l1bh - 1) % (2 * m) == 0) { if (j == 0) bh1 = l1bh - 1; if (j == 3) bh1 = l1bh + 2 * m - 1; if (j == 5) bh1 = l1bh + 4 * m - 1; } if (bh1 > 0 && bh1 <= 2 * n * m) { if (B[bh1] == 1) { int root1 = find(l1bh); int root2 = find(bh1); f[root1] = root2; } } } } } printf("%d", Ans);}

    代码解释

  • 并查集初始化:使用数组f来记录每个节点的父节点,初始时每个节点的父节点为0。
  • 查找函数:用于查找节点的根节点,路径压缩和按秩合并优化了查找时间。
  • 处理每个操作:读取输入数据,计算每个区块的编号。
  • 检查连通性:遍历该区块及其周围八个相邻区块,检查是否存在连通的通道。
  • 执行操作:如果操作可行,标记改造区块,并更新并查集。
  • 输出结果:统计并输出可行操作的数量。
  • 转载地址:http://qqkg.baihongyu.com/

    你可能感兴趣的文章
    python3打开txt文件_使用Python 3从文本文件读取句子并添加到列表中
    查看>>
    python3爬虫抓取智联招聘职位信息代码
    查看>>
    Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
    查看>>
    python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
    查看>>
    Python3笔记——IDE的选择
    查看>>
    python3简单使用requests 用户代理,cookie池
    查看>>
    Python3组播通信编程实现教程(发送者+接收者)
    查看>>
    Python3编写网络爬虫10-数据存储方式三-CSV文件存储
    查看>>
    python3读取redis返回数据带有'b'的问题
    查看>>
    Python3连接MySQL
    查看>>
    Python关于isinstance函数的解析 | 附Demo(全)
    查看>>
    Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
    查看>>
    python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
    查看>>
    python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
    查看>>
    Python: AES加密与解密
    查看>>
    Python: Range() 最大尺寸;动态的还是静态的?
    查看>>
    Python: Windows下用 multiprocessing 的深坑
    查看>>
    python:Could not find platform independent libraries <prefix>解决方法
    查看>>
    Python:datetime tzinfo 时区名称文档
    查看>>
    Python:deepcopy(list) vs new_list = old_list[:]
    查看>>