poj3678 Katu Puzzle(2sat入门好题)
src:poj3678
AC代码:
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdio.h> #include<algorithm> #include<vector> #include<stack> using namespace std; int Max(int a, int b) { return a > b ? a : b; } int Min(int a, int b) { return a > b ? b : a; } #define FOR(i,a,b) for(int i=a;i<=b;i++) typedef long long LL; typedef unsigned long long ull; const double INF = 99999999999.0; const double eps = 1e-6; #define siz 2200 int n,m; int dfn[siz],low[siz],id[siz],scc,index; bool in[siz],flag; stack<int>st; vector<int>g[siz]; void init() { scc=index=0; flag=true; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(id,0,sizeof(id)); memset(in,false,sizeof(in)); while(!st.empty())st.pop(); for(int i=0;i<2*n;i++)g[i].clear(); } void add_edge(int u,int v) { g[u].push_back(v); } void read() { int a,b,c; char s[4]; for(int i=1;i<=m;i++){ scanf("%d%d%d%s",&a,&b,&c,s); if(strcmp(s,"AND")==0){ if(c==0){ add_edge(2*a,2*b+1);add_edge(2*b,2*a+1); } else if(c==1){ //add_edge(2*a,2*b);add_edge(2*b,2*a);//可删可留 add_edge(2*a+1,2*a);add_edge(2*b+1,2*b); } } else if(strcmp(s,"OR")==0){ if(c==0){ //add_edge(2*a+1,2*b+1);add_edge(2*b+1,2*a+1); add_edge(2*a,2*a+1);add_edge(2*b,2*b+1); } else if(c==1){ add_edge(2*a+1,2*b);add_edge(2*b+1,2*a); } } else if(strcmp(s,"XOR")==0){ if(a==b&&c==0)continue; if(c==1){ add_edge(2*a,2*b+1);add_edge(2*b+1,2*a); add_edge(2*b,2*a+1);add_edge(2*a+1,2*b); } else if(c==0){ add_edge(2*a,2*b);add_edge(2*b+1,2*a+1); add_edge(2*b,2*a);add_edge(2*a+1,2*b+1); } } } } void tarjan(int u) { dfn[u]=low[u]=++index; st.push(u);in[u]=true; for(int i=0;i<g[u].size();i++){ int v=g[u][i]; if(dfn[v]==0){ tarjan(v); low[u]=min(low[u],low[v]); } else if(in[v])low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]){ int tmp; ++scc; do{ tmp=st.top();st.pop(); id[tmp]=scc;in[tmp]=false; }while(tmp!=u); } } void solve() { for(int i=0;i<2*n;i++)if(dfn[i]==0)tarjan(i); for(int i=0;i<n;i++){ if(id[2*i]==id[2*i+1]){ printf("NO\n");return; } } printf("YES\n"); } int main() { while(scanf("%d %d",&n,&m)!=EOF){ init(); read(); solve(); } return 0; }

浙公网安备 33010602011771号