#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 10;
int T, N, M, par[maxn], val[maxn], a[maxn];
struct Date {
char str[10];
int x, y;
}date[maxn];
int Query(int x) {
if (x != par[x]) {
int temp = par[x];
par[x] = Query(par[x]);
val[x] = val[x] ^ val[temp];
}
return par[x];
}
int main() {
while (~scanf("%d %d", &N, &M)) {
int cnt = 0;
for (int i = 1; i <= M; i++) {
scanf("%d%d%s", &date[i].x, &date[i].y, date[i].str); date[i].x--;
a[++cnt] = date[i].x; a[++cnt] = date[i].y;
}
sort(a + 1, a + 1 + cnt);
cnt = unique(a + 1, a + 1 + cnt) - a;
for (int i = 1; i <= cnt; i++) par[i] = i, val[i] = 0;
int ans = 0;
for (int i = 1; i <= M; i++) {
int x = lower_bound(a + 1, a + 1 + cnt, date[i].x) - a;
int y = lower_bound(a + 1, a + 1 + cnt, date[i].y) - a;
int a = Query(x), b = Query(y);
if (a == b) {
if ((val[x] ^ val[y]) % 2 == 0 && date[i].str[0] == 'o') break;
if ((val[x] ^ val[y]) % 2 == 1 && date[i].str[0] == 'e') break;
ans++;
}
else {
if (date[i].str[0] == 'o') {
par[a] = b;
val[a] = val[x] ^ val[y] ^ 1;
}
else {
par[a] = b;
val[a] = val[x] ^ val[y];
}
ans++;
}
}
printf("%d\n", ans);
}
}
POJ 1733 Parity game——并查集 + 离散化
原创
©著作权归作者所有:来自51CTO博客作者软糖酱八号机的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java8处理对象List集合之间的交集、并集、差集和去重
Java8处理对象List集合之间的交集、并集、差集和去重
交集 并集 去重 Stream 差集 -
POJ-1733 Parity game(并查集+数据离散化)
经典的并查集+数据离散化如果不懂离散化的可以看看笔者
并查集+数据离散化 离散化 结点 #define -
poj1733 Parity game(并查集)
题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的思路:一类
#include i++ #define -
POJ - 1733 Parity game 带权并查集
一、内容
#include i++ git -
CEOI 1999 Parity game (并查集+离散化)
Parity gameTime Limit: 1000MS Memory Limit: 65536KTotal Su
ceoi1999 parity 并查集 poj1733 #include -
poj 1733(带权并查集)
题意:有n个结点,给出了q个操作,操作是a b string表示结点a到结点b的和是奇数或偶
结点 i++ #include