您的位置:首页 > 其它

poj 3678 (2-SAT)

2014-01-22 12:35 369 查看
题意:给定一些变量告诉你他们之间的表达式包括其中的and or xor 然后让你计算是不是有满足的解。

思路:典型的2—SAT问题,首先我是把所有的逻辑表达式化简成->表示然后再a->b之间建立一条边。接着套模版就OK了。

代码如下:

//2014-01-21-14.47
//2-SAT
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#define MP(a, b) make_pair(a, b)
#define PB(a) push_back(a)

using namespace std;

typedef long long ll;
typedef pair<int ,int> pii;
typedef pair<unsigned int, unsigned int> puu;
typedef pair<int ,double> pid;
typedef pair<ll, int> pli;

const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const int LEN = 1010;
vector<int> Map[LEN];
bool mark[LEN*2];
int S[LEN*2], c;

bool dfs(int x) {
if(mark[x^1]) return false;
if(mark[x]) return true;
mark[x] = true;
S[c++] = x;
for(int i=0; i<Map[x].size(); i++)
if(!dfs(Map[x][i])) return false;
return true;
}

void init(int n){
for(int i=0; i<n*2; i++)Map[i].clear();
memset(mark, 0, sizeof mark);
}

void add_clause(int x, int xval, int y, int yval)
{
x = x*2 + xval;
y = y*2 + yval;
Map[x].PB(y);
}

bool solve(int n){
for(int i=0; i<n*2; i+=2)
if(!mark[i] && !mark[i+1]){
c = 0;
if(!dfs(i)) {
while(c > 0) mark[S[--c]] = false;
if(!dfs(i+1)) return false;
}
}
return true;
}

int main()
{
//    freopen("in.txt", "r", stdin);

int n, m, a, b, res;
char op[11];
while(scanf("%d%d", &n, &m)!=EOF){
init(n);
for(int i=0; i<m; i++){
scanf("%d%d%d%s", &a, &b, &res, op);
if(!strcmp(op, "AND") && res) {
add_clause(a, 0, a, 1);
add_clause(b, 0, b, 1);
}else if(!strcmp(op, "AND") && !res){
add_clause(a, 1, b, 0);
add_clause(b, 1, a, 0);
}else if(!strcmp(op, "XOR") && res){
add_clause(a, 0, b, 1);
add_clause(a, 1, b, 0);
add_clause(b, 0, a, 1);
add_clause(b, 1, a, 0);
}else if(!strcmp(op, "XOR") && !res){
add_clause(a, 0, b, 0);
add_clause(a, 1, b, 1);
add_clause(b, 0, a, 0);
add_clause(b, 1, a, 1);
}else if(!strcmp(op, "OR") && res){
add_clause(a, 0, b, 1);
add_clause(b, 0, a, 1);
}else {
add_clause(a, 1, a, 0);
add_clause(b, 1, b, 0);
}
}
if(solve(n)) printf("YES\n");
else printf("NO\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: