试题 合根植物

资源限制

时间限制:2.0s   内存限制:256.0MB


问题描述

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

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

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


输入格式

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

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

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

#include<cstdlib>

#include<cstring>

#include<cmath>

#include<iostream>

#include<algorithm> //sort(A, A + n);

#include<string>

#include<vector>

#include<queue>

#include<map> 

#include<set>

using namespace std;

const int MAX = 1000000;

int temp[MAX];

int find(int x) {

if (temp[x] == x)return x;

else

return temp[x] = find(temp[x]);

}

void unite(int x, int y) {

int a = find(x);

int b = find(y);

if (a != b)temp[a] = b;

}

int main(void) {

int m, n;

long int num;

cin >> m >> n >> num;

for (int i = 1; i <= m * n; i++) temp[i] = i;

int x, y;

while ((num--) != 0) {

cin >> x >> y;

unite(x, y);

}

int tap = 0;

for (int i = 1; i <= m * n; i++)

{

if (temp[i] == i)tap++;

}

cout << tap;

system("pause");

return 0;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容