当前位置: 首页 > news >正文

Codeforces Round 134 (Div. 1) A. Ice Skating (并查集)

Ice Skating

题面翻译

Description

给出n个点的横纵坐标,两个点互通当且仅当两个点有相同的横坐标或纵坐标,问最少需要加几个点才能使得所有点都两两互通

Input

第一行一个整数n表示点数,之后n行每行两个整数x[ i ]和y[ i ]表示第i个点的横纵坐标(1<=n<=100,1<=x[ i ],y[ i ]<=1000)

Output

输出需要加的最少点数

题目描述

Bajtek is learning to skate on ice. He’s a beginner, so his only mode of transportation is pushing off from a snow drift to the north, east, south or west and sliding until he lands in another snow drift. He has noticed that in this way it’s impossible to get from some snow drifts to some other by any sequence of moves. He now wants to heap up some additional snow drifts, so that he can get from any snow drift to any other one. He asked you to find the minimal number of snow drifts that need to be created.

We assume that Bajtek can only heap up snow drifts at integer coordinates.

输入格式

The first line of input contains a single integer $ n $ ( $ 1<=n<=100 $ ) — the number of snow drifts. Each of the following $ n $ lines contains two integers $ x_{i} $ and $ y_{i} $ ( $ 1<=x_{i},y_{i}<=1000 $ ) — the coordinates of the $ i $ -th snow drift.

Note that the north direction coinсides with the direction of $ Oy $ axis, so the east direction coinсides with the direction of the $ Ox $ axis. All snow drift’s locations are distinct.

输出格式

Output the minimal number of snow drifts that need to be created in order for Bajtek to be able to reach any snow drift from any other one.

样例 #1

样例输入 #1

2
2 1
1 2

样例输出 #1

1

样例 #2

样例输入 #2

2
2 1
4 1

样例输出 #2

0

使用并查集求解。

首先应明确,在这道题中,想要连接任意两堆雪,只需要增加一堆雪就可以。
然后我们想在想要知道应该增加几堆雪,就只需要知道有几堆雪没有连接起来,没有连接的雪的数量减一就是需要增加的雪堆的数量。

那么只需要枚举所有的点,然后使用并查集合并上所有能够在同一个横轴或者纵轴的点,最后求解出来连通块的数量,就能够得到没有连通的数量。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
#define pii pair<int,int>
#define x first
#define y secondint p[N];
int n;
pii a[N];int find(int x){if(x != p[x])p[x] = find(p[x]);return p[x];
}int main(){cin >> n;for(int i = 1;i <= n;i++)cin >> a[i].x >> a[i].y;for(int i = 0;i < N;i++)p[i] = i;for(int i = 1;i <= n;i++){for(int j = i + 1;j <= n;j++){if(a[i].x == a[j].x || a[i].y == a[j].y){p[find(i)] = find(j);}}}int cnt = 0;for(int i = 1;i <= n;i++)if(p[i] == i)cnt++;cout << cnt - 1 << endl;return 0;
}
http://www.lryc.cn/news/346229.html

相关文章:

  • 深入了解 Flask Request
  • 前端测试策略与实践:单元测试、E2E测试与可访问性审计
  • 修改el-checkbox样式
  • UE5缺少SDK,而无法在windows平台打包的解决方法
  • 4G,5G执法记录仪人脸识别、人脸比对使用说明
  • 掌握SEO优化的关键:提升网站排名的秘籍(如何提高网站seo排名)
  • 大模型微调之 在亚马逊AWS上实战LlaMA案例(九)
  • Php php7的特性
  • node pnpm修改默认包的存储路径
  • Adobe-Premiere-CEP 扩展 入门-视频剪辑-去气口插件-Silence Remover
  • 基于多目标灰狼算法的冷热电联供型微网低碳经济调度
  • Python 正则表达式 (?=...) 和 (?<=...) 符号
  • Vue.js中使用JavaScript实现路由跳转详解
  • 社群裂变:从微光到星火的社群增长奥秘
  • Git命令Gitee注册idea操作git超详细
  • 出差行程到底怎么管?这个“高分指南”划重点来了!
  • js设计模式--发布订阅者模式
  • 【图论】图论基础
  • Konga域名配置多个路由
  • 15.计算机网络
  • 【大数据·hadoop】在hdfs上运行shell基本常用命令
  • TCP/IP 协议基础:构建互联网基石
  • Android OpenMAX(三)高通OMX组件实现基础
  • 【比邻智选】MF871U模组
  • Unity 单例模式
  • Oracle-一次TX行锁堵塞事件
  • Gtid方式搭建主从复制+MHA高可用集群
  • 基于matlab GUI的Alpha shapes边缘提取
  • [Android]常见的包管理方式
  • 每日10亿数据的日志分析系统OOM