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;
}