首页 > 其他分享 >【洛谷 P8654】[蓝桥杯 2017 国 C] 合根植物 题解(并查集)

【洛谷 P8654】[蓝桥杯 2017 国 C] 合根植物 题解(并查集)

时间:2024-03-29 11:33:18浏览次数:26  
标签:pre 小格子 合根 格子 int 题解 样例 蓝桥

[蓝桥杯 2017 国 C] 合根植物

题目描述

w 星球的一个种植园,被分成 m × n m \times n m×n 个小格子(东西方向 m m m 行,南北方向 n n n 列)。每个格子里种了一株合根植物。

这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。

如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?

输入格式

第一行,两个整数 m m m, n n n,用空格分开,表示格子的行数、列数( 1 < m , n < 1000 1<m,n<1000 1<m,n<1000)。

接下来一行,一个整数 k k k,表示下面还有 k k k 行数据 ( 0 < k < 1 0 5 ) (0<k<10^5) (0<k<105)。

接下来 k k k 行,每行两个整数 a a a, b b b,表示编号为 a a a 的小格子和编号为 b b b 的小格子合根了。

格子的编号一行一行,从上到下,从左到右编号。

比如: 5 × 4 5 \times 4 5×4 的小格子,编号:

1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
17 18 19 20

输出格式

一行一个整数,表示答案

样例 #1

样例输入 #1

5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17

样例输出 #1

5

提示

样例解释

时限 1 秒, 256M。蓝桥杯 2017 年第八届国赛


思路

并查集是一种数据结构,主要用于处理一些元素分组问题,可以快速判断两个元素是否属于同一组,也可以快速将两个元素合并到同一组。

首先,读取格子的行数 m m m、列数 n n n 和合根的对数 k k k。然后,初始化并查集,每个元素的父节点都是自己。

接着,读取 k k k 对合根的格子,对于每一对,找到它们的根节点,如果不同则合并。

最后,遍历所有的格子,如果格子的父节点是自己,说明这是一个独立的并查集,即一个合根植物,将答案加一。


AC代码

#include <algorithm>
#include <cmath>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;

int m, n, k;
int pre[N];

int root(int x) {
	int i = x;
	while (i != pre[i]) {
		i = pre[i];
	}
	return i;
}

void merge(int a, int b) {
	int ra = root(a);
	int rb = root(b);
	if (ra == rb) {
		return;
	}
	pre[ra] = rb;
}

int main() {
	scanf("%d %d %d", &m, &n, &k);
	int mn = m * n;

	for (int i = 0; i <= mn; i++) {
		pre[i] = i;
	}

	for (int i = 1; i <= k; i++) {
		int a, b;
		scanf("%d %d", &a, &b);
		merge(a, b);
	}

	ll ans = 0;
	for (int i = 1; i <= mn; i++) {
		if (pre[i] == i) {
			ans++;
		}
	}
	printf("%lld", ans);
	return 0;
}

标签:pre,小格子,合根,格子,int,题解,样例,蓝桥
From: https://blog.csdn.net/qq_34988204/article/details/137127460

相关文章

  • 启动应用程序出现FirewallAPI.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个FirewallAPI.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现fthsvc.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个fthsvc.dll文件(挑选合适的版本文件)把它放......
  • 启动应用程序出现fontext.dll找不到问题解决
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个fontext.dll文件(挑选合适的版本文件)把它放......
  • Leetcode 第 126 场双周赛题解
    Leetcode第126场双周赛题解Leetcode第126场双周赛题解题目1:3079.求出加密整数的和思路代码复杂度分析题目2:3080.执行操作标记数组中的元素思路代码复杂度分析题目3:3081.替换字符串中的问号使分数最小思路代码复杂度分析题目4:3082.求出所有子序列的能量和思......
  • Leetcode 第 388 场周赛题解
    Leetcode第388场周赛题解Leetcode第388场周赛题解题目1:3074.重新分装苹果思路代码复杂度分析题目2:3075.幸福值最大化的选择方案思路代码复杂度分析题目3:3076.数组中的最短非公共子字符串思路代码复杂度分析题目4:3077.K个不相交子数组的最大能量值思路代码......
  • 蓝桥杯-百亿富翁
    题意:n个点,求出每个点的左边,右边,第一个比他高的点。思路:单调栈。voidsolve(){intn;cin>>n;vector<int>a(n);for(auto&x:a){cin>>x;}stack<int>stk;vector<pair<int,int>>ans(n,{-1,-1});......
  • lanqiao106. 正则问题 (第八届蓝桥杯C++A组)或者 acwing 1225. 正则问题
    问题:知识补充:1. 正则表达式的计算①括号代表优先计算,②或符号代表二选一。比如给的例子:((xx|xxx)x|(x|xx))xx 2. 字符串的语法问题:string是字符串的类型,使用的时候也使像字符一样使用,加入定义stringstr,那么使用的时候要写成str[]思考:妈呀一开始我不会算正则表达......
  • 大一下第四周ACM实验课题解
    7-1ACM宣传作者杜祥军单位青岛大学LB大神想组织集训队去学校各处宣传ACM,但是大神不想让队员们走太多路,因此想写代码计算一下,到各地宣传再回到博知401的最短路径总和是多少。已知:学校一共有n个宣传点,博知401是标号为1的点。剩下n-1个点每个点各派1位队员,询问每个队员到达宣......
  • 蓝桥杯 2022 省A 选数异或
    一种比较无脑暴力点的方法,时间复杂度是(n²+m)。(注意==的优先级比^高,记得加括号(a[i]^a[j])==x)#include<iostream>#include<vector>#include<bits/stdc++.h>//包含一些C++标准库中未包含的特定实现的函数的头文件usingnamespacestd;intmain(){intn,......
  • 题解:CF1623B Game on Ranges
    题意理解(建议先自己把原题描述看一遍再来看我的理解)有一个集合,这个集合的元素是区间,一开始集合里只有一个元素就是\([1,n]\)的区间,对这个集合我们可以选择其中的一个元素(区间),然后在区间内选一个数d,以\([l,d-1]\)和\([d+1,r]\)这两个区间替换掉我们选择的这个区间(\(l\)和......