HDU 4421 2-SAT

来源:互联网 发布:软件功能 编辑:程序博客网 时间:2024/04/30 07:56

这题我做了5小时啊亲~~

昨天才学得2-SAT,今天来做这道表示对建图压力很大,= =

 

每次32次2-SAT 爽爆了!!

 建单向边AC了 双向边就WA  但是不是G[I][J]=A[I]|A[J]  G[J][I]=A[J]|A[I], 图是对称的啊。。这样下来,边不也该双向了吗?没搞懂

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<iostream>#include<string.h>#include<algorithm>#include<queue>#include<vector>#include<map>#include<string>#define ll __int64typedef long long LL;#define INF 0x7fffffffffffffff#define inf 0x7fffffff#define eps 1e-10#define pi acos(-1.0)#define FRE freopen("in.txt","r",stdin)#define E exp(1.0)#define log2(x) log((x))/log(2.0)#define maxn  1010#define maxe  1001000using namespace std;struct node{    int v,next;}edge[maxe];int n;int size,head[maxn];int dfn[maxn],low[maxn],sstack[maxn],instack[maxn],scc[maxn];int idex,cnt,top;int g[510][510];int bit[maxn];void init(){    memset(head,-1,sizeof(head));    memset(dfn,-1,sizeof(dfn));    memset(instack,0,sizeof(instack));    idex=cnt=size=0,top=-1;}void addedge(int u,int v){    edge[size].v=v;    edge[size].next=head[u];    head[u]=size++;}void build(int id){    int i,j;    for(i=0;i<n;i++)    {        for(j=i+1;j<n;j++)        {            if(i%2==1&&j%2==1)            {                int t=(g[i][j]/(1<<id))%2;                //printf("%d\n",t);                if(t==1)                {                    addedge(i,j+n);                    addedge(j,i+n);                    //addedge(bit[j+n],bit[i]);                    //addedge(bit[i+n],bit[j]);                }                else if(t==0)                {                    addedge(i+n,i);                    //addedge(bit[i],bit[i+n]);                    addedge(j+n,j);                    //addedge(bit[j],bit[j+n]);                }            }            else if(i%2==0&&j%2==0)            {                int t=(g[i][j]/(1<<id))%2;                //printf("%d\n",t);                if(t==1)                {                    addedge(i,i+n);                    //addedge(bit[i+n],bit[i]);                    addedge(j,j+n);                    //addedge(bit[j+n],bit[j]);                }                else if(t==0)                {                    addedge(j+n,i);                    //addedge(bit[i],bit[j+n]);                    addedge(i+n,j);                    //addedge(bit[j],bit[i+n]);                }            }            else            {                 int t=(g[i][j]/(1<<id))%2;                 //printf("%d\n",t);                 if(t==1)                 {                   addedge(i+n,j);                   addedge(j,i+n);                   addedge(j+n,i);                   addedge(i,j+n);                 }                 else if(t==0)                 {                     addedge(i,j);                     addedge(j,i);                     addedge(i+n,j+n);                     addedge(j+n,i+n);                 }            }        }    }}void tarjan(int u){    sstack[++top]=u;    instack[u]=1;    dfn[u]=low[u]=idex++;    for(int i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].v;        if(dfn[v]==-1)        {            tarjan(v);            low[u]=min(low[u],low[v]);        }        else if(instack[v])        {            low[u]=min(low[u],dfn[v]);        }    }    if(dfn[u]==low[u])    {        for(int v=-1;v!=u;top--)        {            v=sstack[top];            instack[v]=0;            scc[v]=cnt;        }        cnt++;    }}void solve(){    for(int i=0;i<2*n;i++)    {        if(dfn[i]==-1)        tarjan(i);    }}bool check(){    for(int i=0;i<n;i++)    {        if(scc[i]==scc[i+n])        return false;    }    return true;}int main() {   //FRE;   while(scanf("%d",&n)==1)   {       int i,j;       for(i=0;i<n;i++)       for(j=0;j<n;j++)         scanf("%d",&g[i][j]);       for(i=0;i<n;i++)       {           bit[i]=0;           bit[i+n]=1;       }       int flag=0;       for(i=0;i<32;i++)       {           init();           build(i);           solve();           if(check()==false)           {              flag=1;              break;           }       }       if(flag)       printf("NO\n");       else       printf("YES\n");   }   return 0;}


 

 

 

原创粉丝点击