传送门

题意:

给出n个矩形,把重合的矩形归成一个图形,问合并以后剩下几个图形

思路:

我开始想用dfs,但是发现不太行。

后来知道才是并查集 Orz

用一个结构体数组存矩形的左下角和右上角的坐标,再用一个一维数组来进行并查集的查找合并。

进行两层for循环,对i找i以后的矩形用不用合并,判断用不用合并的条件就是a的左下角在b右上角的左下方,a的右上角在b的左下角的右上方。

如果是需要合并,我们就找到这两个点的祖先,修改一维数组的值,最后只想要循环一遍,看看祖先是本身的有几个,即为答案。

#include<bits/stdc++.h>
using namespace std;
#define MAX 120+5
typedef long long ll ;
int tr[MAX], n;
struct ran
{
int x1, y1, x2, y2;
}ar[MAX];
int judge(ran a, ran b)
{
if(a.x1 < b.x2 && a.y1 < b.y2 && a.x2 > b.x1 && a.y2 > b.y1)
return 1;
else
return 0;
}
void init()//初始化
{
for(int i = 0; i <= n; i++)
tr[i] = i;
}
int tfind(int x)//找爹函数
{
if(tr[x] == x)
return x;
else
return tr[x] = tfind(tr[x]);//这里是先进行的赋值操作再进行的return操作
}
void tmerge(int a, int b)//合并操作
{
int x = tfind(a);
int y = tfind(b);
if(x != y)//我是采用的以左为尊的原则
tr[y] = x;
}
int main()
{
cin>>n;
init();//初始化
for(int i = 1; i <= n; i++)
{
cin>>ar[i].x1>>ar[i].y1>>ar[i].x2>>ar[i].y2;
}
for(int i = 1; i <= n; i++)
{
for(int j = i + 1; j <= n; j++)
{
if(judge(ar[i], ar[j]))
tmerge(i, j);
}
}
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(tr[i] == i)
++ans;
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. 原生js实现fadein 和 fadeout
  2. redis-内存异常 Redis is configured to save RDB snapshots解决
  3. AppDelegate动态加载StoryBoard
  4. asp值mysql驱动
  5. 关于synchronized 影响可见性的问题
  6. Siege——多线程编程最佳实例
  7. C#获取相对路径的方法
  8. R12 - OM改进了对成本与收入确认的流程
  9. mongoDB 3.0.3 以上GUI 连接认证问题
  10. 我使用过的Linux命令之file - 检测并显示文件类型
  11. 1. Skippr
  12. CEPH s3 java sdk PUT对象并在同一个PUT请求中同时设置ACL为 Public
  13. 关于减少BUG的思考
  14. 调用约定__cdecl __fastcall与__stdcall
  15. 流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署
  16. Java项目多数据源配置 (转)
  17. 洛谷 [USACO09OPEN]工作调度
  18. K8S网络排故障一则--iptables规则
  19. Java实现-2016百度秋招(颜色反转、相似字符串)
  20. js获取当前域名的方法

热门文章

  1. 两个很赞的用法(count函数里的表达式+计算时间间隔)
  2. 入门Kubernetes -基础概念
  3. VRP OS Management
  4. Cisco常用命令
  5. 浅谈 Checkbox Group 的双向数据绑定
  6. 虚拟机linux共享文件夹
  7. nginx日志按天切割
  8. Kubernetes 开船记-脚踏两只船:用 master 服务器镜像克隆出新集群
  9. 18V转5V,18V转3.3V,18V转3V稳压芯片,0.01A-3A输出
  10. mysql忽略表中的某个字段不查询