测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40827. 合根植物

填空题 困难

题目描述

合根植物

题目描述

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

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

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

输入格式

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

接下来一行,一个整数 k,表示下面还有 k 行数据(0 < k < 100000)

接下来 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

样例解释

参考答案

#include <iostream> #include <cstdio> using namespace std; const int N = 1e6 + 10; int p[N]; int a, b, n, m, k, ans; int find(int x) { if(p[x] != x) p[x] = find(p[x]); return p[x]; } int main() { cin >> m >> n >> k; for (int i = 1; i <= n * m; i ++) p[i] = i; int root = n * m; while(k --) { scanf("%d%d", &a, &b); if(find(a) != find(b)) { p[find(a)] = find(b); root --; } } cout << root << endl; return 0; }
上一题 下一题