1594D The Number of Imposters

带权并查集

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define endl "\n"
#define LL long long
using namespace std;
const int N = 2e5 + 10;
int t, n, m;
int p[N], dis[N], cnt[N][2];
void init()
{
	for (int i = 1; i <= n; i ++ ) {
		p[i] = i;
		dis[i] = 0;
		cnt[i][0] = 1, cnt[i][1] = 0;
	}
}
int find(int x)
{
	if (p[x] != x)	{
		int root = find(p[x]);
		dis[x] ^= dis[p[x]];
		p[x] = root;
	}
	return p[x];
}
void solve()
{
	cin >> n >> m;
	init();
	bool flag = 1;
	for (int i = 1; i <= m; i ++ ) {
		int a, b;
		string s;
		bool val = 0;
		cin >> a >> b >> s;
		if (s == "imposter")	val = 1;	
		int pa = find(a), pb = find(b);
		if (pa == pb) {
			if ((dis[a] ^ dis[b]) != val)	flag = 0;
		}
		else {
			p[pb] = pa;
			dis[pb] = val ^ dis[a] ^ dis[b];
			cnt[pa][1] += cnt[pb][dis[pb] ^ 1];
			cnt[pa][0] += cnt[pb][dis[pb]];
		}	
	}
	if (flag == 0)	{
		cout << -1 << endl;
		return;
	}
	int res = 0;
	for (int i = 1; i <= n; i ++ )
		if (find(i) == i)
			res += max(cnt[i][0], cnt[i][1]);
	cout << res << endl; 
}
int main() {
	IOS;
	cin >> t;
	while (t -- )	solve();
	return 0;
}
posted @ 2022-02-28 23:31  Angels_of_Death  阅读(36)  评论(0)    收藏  举报