记录编号 571734 评测结果 AAAAA
题目名称 POJ 3678]卡图难题 最终得分 100
用户昵称 Gravatar锝镆氪锂铽 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2022-06-16 22:04:07 内存使用 0.00 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <stack>
#define min(x,y) x < y ? x : y
using namespace std;
const int maxN = 1e3 + 10, maxM = 1e6 + 10;

void tarjan(int x);
void add(int x, int y);

int m, n;
int head[maxN], ver[maxM], Next[maxM], tot,
	C[maxN], dfn[maxN], low[maxN], cnt, num;
bool ans[maxN];
stack <int> st;
int main(void){
	freopen("katu.in", "r", stdin);
	freopen("katu.out", "w", stdout);
	scanf("%d%d", &n, &m);
	int a, b, c;
	char op[5];
	for (int i = 1; i <= m; i ++){
		scanf("%d%d%d%s", &a, &b, &c, op);
		if (op[0] == 'A'){
			if (c){
				add(a, a + n);
				add(b, b + n);
			}
			else{
				add(a + n, b);
				add(b + n, a);
			}
		}
		else if (op[0] == 'O'){
			if (c){
				add(a, b + n);
				add(b, a + n);
			}
			else{
				add(a + n, a);
				add(b + n, b);
			}
		}
		else{
			if (c){
				add(a, b + n);
				add(b, a + n);
				add(a + n, b);
				add(b + n, a);
			}
			else{
				add(a, b);
				add(b, a);
				add(a + n, b + n);
				add(b + n, a + n);
			}
		}
	}
	for (int i = 0; i <= n >> 1; i ++)
		if (!dfn[i])
			tarjan(i);
	bool flag = true;
	for (int i = 0; i < n; i ++)
		if (C[i] == C[i + n]){
			flag = false;
			break;
		}
	flag ? puts("YES") : puts("NO");
	//system("pause");
	return 0;
}

void add(int x, int y){
	ver[++ tot] = y;
	Next[tot] = head[x];
	head[x] = tot;
}

void tarjan(int x){
	dfn[x] = low[x] = ++ num;
	st.push(x);
	ans[x] = true;
	for (int i = head[x]; i; i = Next[i]){
		if (!dfn[ver[i]]){
			tarjan(ver[i]);
			low[x] = min(low[x], low[ver[i]]);
		}
		else if (ans[ver[i]])
			low[x] = min(low[x], dfn[ver[i]]);
	}
	if (dfn[x] == low[x]){
		cnt ++;
		int y;
		do{
			y = st.top();
			st.pop();
			ans[y] = false;
			C[y] = cnt;
		}while (x != y);
	}
}