求调
查看原帖
求调
1436960
Arabidopsis楼主2024/12/15 17:13

如题,

#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;
}
2024/12/15 17:13
加载中...