题意:
定义一个运算...用a[N]通过一些关系算出b[N[N]...现在给出b[N][N]问是否存在构造它的a[N]...
题解:
被这题坑爆了....首先是爆空间...要拆成31个2-sat分别判断才行..在一个是ZOJ的数据..b[i][i]可能不为0...要直接返回NO..
这题的做法和POJ3678没什么区别...每位分别判断..做31次2-sat就行了...
Program:
#include<iostream> #include<stdio.h> #include<cmath> #include<queue> #include<stack> #include<string.h> #include<map> #include<set> #include<algorithm> #define oo 1000000007 #define MAXN 605 #define ll long long using namespace std; struct node { int y,next; }line[MAXN*MAXN<<2]; int Lnum,_next[MAXN<<1],b[MAXN][MAXN],dfn[MAXN<<1],low[MAXN<<1],tp[MAXN<<1],tpnum,DfsIndex; bool instack[MAXN<<1]; stack<int> mystack; void addline(int x,int y) { line[++Lnum].next=_next[x],_next[x]=Lnum,line[Lnum].y=y; } void tarjan(int x) { int y,i,k; dfn[x]=low[x]=++DfsIndex; mystack.push(x); instack[x]=true; for (k=_next[x];k;k=line[k].next) { y=line[k].y; if (!dfn[y]) { tarjan(y); low[x]=min(low[x],low[y]); }else if (instack[y]) low[x]=min(low[x],dfn[y]); } if (dfn[x]==low[x]) { tpnum++; do { x=mystack.top(); mystack.pop(); tp[x]=tpnum; instack[x]=false; }while (dfn[x]!=low[x]); } } bool _2_sat(int N,int t) { int i,j,h; memset(_next,0,sizeof(_next)); Lnum=0; for (i=0;i<N;i++) for (j=0;j<N;j++) { h=b[i][j]; if (i==j) { if (h) return false; continue; } if (i%2 && j%2) // or { if (h&(1<<t)) addline(i<<1,j<<1|1); else addline(i<<1|1,i<<1); }else // and if (i%2==0 && j%2==0) { if (h&(1<<t)) addline(i<<1,i<<1|1); else addline(i<<1|1,j<<1); } else // xor { if (h&(1<<t)) addline(i<<1,j<<1|1),addline(i<<1|1,j<<1); else addline(i<<1,j<<1),addline(i<<1|1,j<<1|1); } } memset(dfn,0,sizeof(dfn)); memset(instack,false,sizeof(instack)); while (!mystack.empty()) mystack.pop(); DfsIndex=tpnum=0; for (i=0;i<(N<<1);i++) if (!dfn[i]) tarjan(i); for (i=0;i<N;i++) if (tp[i<<1]==tp[i<<1|1]) return false; return true; } bool judge(int N) { for (int i=0;i<32;i++) if (!_2_sat(N,i)) return false; return true; } int main() { int N,i,j; while (~scanf("%d",&N)) { for (i=0;i<N;i++) for (j=0;j<N;j++) scanf("%d",&b[i][j]); if (judge(N)) printf("YES\n"); else printf("NO\n"); } return 0; }