如题,
#include <iostream>
#include <vector>
using namespace std;
class DSUnion
{
public:
DSUnion(size_t size) :_ufs(size * 2 + 1)
{
for (int i = 1; i <= size * 2; ++i)
_ufs[i] = i;
siz = size;
}
int find(int x)
{
if (_ufs[x] != x)
{
_ufs[x] = find(_ufs[x]);
}
return _ufs[x];
}
void merge(int x, int y)
{
auto root_x = find(x);
auto root_y = find(y);
if (root_x != root_y)
_ufs[root_x] = root_y;
}
int count()
{
int ans = 0;
for (int i = 1; i <= siz; ++i)
if (_ufs[i] == i)ans++;
return ans;
}
private:
vector<int> _ufs;
int siz;
};
int main()
{
int n, m;
cin >> n >> m;
DSUnion dsu(n);
while (m--)
{
char opt;
int p, q;
cin >> opt;
cin >> p >> q;
if (opt == 'F')
{
dsu.merge(p, q);
}
else
{
dsu.merge(p, q + n);
dsu.merge(q, p + n);
}
}
cout << dsu.count() << endl;
return 0;
}