
SSLOJ1222 矩形
问题分析:每个矩形本身是一个块。如果两个矩形共享一条边,它们将合并成一个新块。我们需要计算这些块的数量。 并查集:使用并查集来管理矩形的合并。每个矩形初始时是一个块,使用父节点表示它们的所属。 判断公共边:对于每对矩形,检查它们是否有公共边。如果有,合并它们所在的块。 统计块数:最终统计并查集中不同块的数量。 输入读取:读取矩形数量n和每个矩形的顶点坐标。 并查集初始化:每个矩形初始时父节点是自己。 检查公共边:对于每对矩形,检查是否有公共边。如果有,合并它们所在的块。 统计块数:遍历所有矩形,统计不同块的数量。
发布日期:2021-05-07 09:39:52
浏览次数:25
分类:精选文章
本文共 1409 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要将给定的矩形分成不同的块,每个块由两个或多个矩形组成,这些矩形必须共享一条边。我们可以使用并查集(Union-Find)数据结构来高效地管理这些块的合并。
方法思路
解决代码
#include#include #include #include #include using namespace std;struct f { int x, y, x1, y1;};int fa[7001], n;int e;struct f a[7001];int find(int x) { if (fa[x] == x) return x; else return fa[x] = find(fa[x]);}int main() { cin >> n; for (int i = 1; i <= n; ++i) { e++; int x, y, x1, y1; cin >> x >> y >> x1 >> y1; a[i].x = x; a[i].y = y; a[i].x1 = x1; a[i].y1 = y1; fa[i] = i; } for (int i = 1; i <= n; ++i) { for (int j = i + 1; j <= n; ++j) { if (a[i].x <= a[j].x1 && a[j].x <= a[i].x1 || a[i].y <= a[j].y1 && a[j].y <= a[i].y1) { fa[find(i)] = find(j); e--; } } } int count = 0; for (int i = 1; i <= n; ++i) { if (find(i) == i) { count++; } } cout << count << endl; return 0;}
代码解释
这种方法利用并查集的高效合并和查找操作,确保了算法的性能,能够处理较大的输入规模。
发表评论
最新留言
很好
[***.229.124.182]2025年04月12日 21时18分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MSSQL 2005 数据库变成可疑状态
2019-03-06
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2019-03-06
秋色园引发CPU百分百命案的事件分析与总结
2019-03-06
安装jdk并配置环境变量
2019-03-06
稀疏数组
2019-03-06
js的严格模式
2019-03-06
idea的安装和无限期试用
2019-03-06
Oracle VM VirtualBox安装PVE虚拟机
2019-03-06
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2019-03-06
Android MediaPlayer setDataSource failed
2019-03-06
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2019-03-06
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2019-03-06
大前端的自动化工厂(1)——Yeoman
2019-03-06
数据仓库建模方法论
2019-03-06
虚拟机搭建hadoop环境
2019-03-06
DataStax Bulk Loader教程(四)
2019-03-06
物联网、5G世界与大数据管理
2019-03-06
.NET应用框架架构设计实践 - 概述
2019-03-06
Rust 内置 trait :PartialEq 和 Eq
2019-03-06