蓝桥杯 19.合根植物
合根植物
原题目链接
题目描述
W 星球的一个种植园被分成 m × n
个小格子(东西方向 m
行,南北方向 n
列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。
如果我们告诉你哪些小格子之间出现了合根现象,你能计算出这个园中一共有多少株合根植物吗?
输入描述
- 第一行:两个整数
m, n
,用空格分隔,表示格子的行数和列数(1 ≤ m, n ≤ 1000
)。 - 第二行:一个整数
k
(0 ≤ k ≤ 10⁵
),表示下面还有k
行数据。 - 接下来的
k
行:每行两个整数a, b
,表示编号为a
的小格子和编号为b
的小格子合根了。
说明:
格子是按从上到下,从左到右依次编号的。例如 5 × 4
的格子如下编号:
1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16
17 18 19 20
输出描述
输出一个整数,表示最后园中合根植物的数量。
输入样例
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
输出样例
5
样例解释
c++代码
#include<bits/stdc++.h>using namespace std;int m, n, k, a, b;
vector<int> arr;
unordered_set<int> ans;int myfind(int x) {int root = x;while(arr[root] != root) root = arr[root];int i = x, j;while(i != root) {j = arr[i];arr[i] = root;i = j;}return root;
}void mymerge(int x, int y) {x = myfind(x), y = myfind(y);if (x != y) arr[x] = arr[y];
}int main() {cin >> m >> n >> k;arr = vector<int>(m * n + 1);for (int i = 1; i <= m * n; i++) arr[i] = i;while(k--) {cin >> a >> b;mymerge(a, b);}for (int i = 1; i <= m * n; i++) {if (ans.find(myfind(i)) == ans.end()) ans.insert(arr[i]);}cout << ans.size();return 0;
}//by wqs
题目解析
这个是非常简单纯粹的并查集题目。