题目地址
解题思路
由于题目告诉了谁和谁已经和根了,就直接使用并查集就可以了,最后从1到n遍历f数组,检查有多少种数字,就代表多少株植物。
AC代码
#include <iostream>
using namespace std;
int f[1000009];
int vis[1000009];
int Map[1000009];
void init()
{
for (int i=1; i<1000009; i++)
f[i] = i;
}
int find(int x)
{
int root = x;
while (root != f[root])
root = f[root];
while (x != root)
{
int t = f[x];
f[x] = root;
x = t;
}
return root;
}
void Union(int x, int y)
{
int tx = find(x);
int ty = find(y);
f[tx] = ty;
}
int main()
{
int m, n, num, ans = 0;
init();
cin >> m >> n >> num;
for (int i=0; i<num; i++)
{
int a, b;
cin >> a >> b;
if (find(a) != find(b))
{
Union(a, b);
}
}
for (int i=1; i<=m*n; i++)
{
find(i);
if (!vis[f[i]])
{
vis[f[i]] = 1;
ans++;
}
}
cout << ans << endl;
return 0;
}