poj3678 Katu Puzzle 【解法一】

Description

Katu Puzzle is presented as a directed graph G(V, E) with each edge
e(a, b) labeled by a boolean operator op (one of AND, OR, XOR) and an
integer c (0 ≤ c ≤ 1). One Katu is solvable if one can find each
vertex Vi a value Xi (0 ≤ Xi ≤ 1) such that for each edge e(a, b)
labeled by op and c, the following formula holds:

Xa op Xb = c

The calculating rules are: AND 0 1 0 0 0 1 0 1 OR 0 1 0 0 1 1 1 1
XOR 0 1 0 0 1 1 1 0

Given a Katu Puzzle, your task is to determine whether it is solvable.

Input

The first line contains two integers N (1 ≤ N ≤ 1000) and M,(0 ≤ M ≤
1,000,000) indicating the number of vertices and edges. The following
M lines contain three integers a (0 ≤ a < N), b(0 ≤ b < N), c and an
operator op each, describing the edges.

Output

Output a line containing “YES” or “NO”.

解法二见【这里】
2-SAT模板题。
把每个点拆成选和不选,然后用每个条件相互连边。
比如a&b=0就是a=1->b=0,b=1->a=0,也就是说连边表示由起点这个状态能推导出终点的状态。
比较特殊的是a&b=1和a|b=0,这就不是推导关系了,而是已经确定的元素。这里需要特殊判断一下。
然后在图上进行dfs,直到所有点都被标记为止。需要注意的是不需要回溯,也就是如果某一个点无论取1还是0都失败了,那就不用再回去更改之前的值,直接宣告失败即可。

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
vector<int> to[2010];
stack<int> sta;
int 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值