hdu 4421 和poj3678类似二级制操作(2-sat问题)

/*
题意:还是二进制异或,和poj3678类似
建边和poj3678一样
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 2100
struct node{
int v,next;
}bian[N*N];
int head[N],dfn[N],low[N],vis[N],stac[N],belong[N],yong,ans,index,top;
void init() {
yong=index=ans=top=0;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
}
void addedge(int u,int v) {
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
int Min(int v,int vv) {
return v>vv?vv:v;
}
void tarjan(int u) {
dfn[u]=low[u]=++index;
stac[++top]=u;
vis[u]=1;
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
    int v=bian[i].v;
    if(!dfn[v]) {
        tarjan(v);
        low[u]=Min(low[u],low[v]);
    }
    else
        if(vis[v])
        low[u]=Min(low[u],dfn[v]);
}
if(dfn[u]==low[u]) {
    ++ans;
    int t;
    do {
        t=stac[top--];
        belong[t]=ans;
        vis[t]=0;
    }while(t!=u);
}
}
int ma[N][N];
int judge(int n) {
int i,j;
for(i=0;i<n;i++) {
    if(ma[i][i])return 1;
    for(j=0;j<n;j++)
    if(ma[i][j]!=ma[j][i])return 1;
}
return 0;
}
int endd(int n) {
int i;
for(i=0;i<2*n;i++)if(!dfn[i])tarjan(i);
for(i=0;i<n;i++)
    if(belong[i]==belong[i+n])
    return 1;
return 0;
}
int main() {
    int n,m,i,j,k;
    while(scanf("%d",&n)!=EOF) {
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            scanf("%d",&ma[i][j]);
        if(judge(n)) {
            printf("NO\n");
            continue;
        }
        for(k=0;k<32;k++) {
         init();
            for(i=0;i<n;i++)
            for(j=i+1;j<n;j++) {
                if(i==j)continue;
                m=ma[i][j]&(1<<k);
                if(i%2==1&&j%2==1) {
                    if(m) {
                        addedge(i+n,j);addedge(j+n,i);//0,0
                    }
                    else {
                        addedge(i,j);addedge(j+n,i+n);//1,0
                        addedge(i+n,j+n);addedge(j,i);//0,1
                        addedge(i,j+n);addedge(j,i+n);//1,1
                    }
                }
                else if(i%2==0&&j%2==0) {
                    if(m) {
                      addedge(i,j);addedge(j+n,i+n);//1,0
                      addedge(i+n,j+n);addedge(j,i);//0,1
                      addedge(i+n,j);addedge(j+n,i);//0,0
                    }
                    else {
                          addedge(i,j+n);addedge(j,i+n);//1,1
                    }
                }
                else {
                    if(m) {
                              addedge(i+n,j);addedge(j+n,i);//0,0
                              addedge(i,j+n);addedge(j,i+n);//1,1
                    }
                    else {
                          addedge(i,j);addedge(j+n,i+n);//1,0
                      addedge(i+n,j+n);addedge(j,i);//0,1
                    }
                }
            }
            if(endd(n))break;
        }
        if(k==32)printf("YES\n");
        else
            printf("NO\n");
    }
return 0;}

时间: 2024-08-28 09:45:23

hdu 4421 和poj3678类似二级制操作(2-sat问题)的相关文章

HDU 4421 Bit Magic(2-sat)

HDU 4421 Bit Magic 题目链接 题意:就依据题目,给定b数组.看能不能构造出一个符合的a数组 思路:把每一个数字的每一个二进制位单独考虑.就变成一个2-sat题目了,依据题目中的式子建立2-sat的边.然后每一位跑2-sat.假设每位都符合.就是YES,假设有一位不符合就是NO 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #incl

Hdu 2473(并查集删除操作) Junk-Mail Filter

有木有很吊 加强 加强版   啊  ,看了都不敢做了   ,后来先做了食物链这个我还是看过的,但还是A不掉,没明白神魔意思 ,总而言之,大牛的博客是个好东西,我就那么看了一下,还是不懂怎莫办啊,哎,就那样就A掉了....... 今天我们来谈一下这个并查集的删除操作,根据我对大牛的理解啊,这个并查集的删除操作并不是把原来的节点删除掉,而是用一个替身替掉,现在的这个点只是用作桥梁的作用,即是无用的,del  ,,,del  ,,,,删除,那些被删掉的就从n开始给他们一个地址,然后即如下代码所示 #i

hdu 3473 Minimum Sum(划分树-sum操作)

划分树.只是考虑求当前区间大于第k值的值得和,和小于第k值的和.显然可以在查询的时候直接搞出来.sum[d][i]表示第d层子区间l,r种l-i的和.写错了一个下标,检查了半辈子... #include<algorithm> #include<iostream> #include<cstring> #include<vector> #include<cstdio> #include<cmath> #include<queue&g

HDU 5186 zhx&#39;s submissions (进制转换)

Problem Description As one of the most powerful brushes, zhx submits a lot of code on many oj and most of them got AC. One day, zhx wants to count how many submissions he made on n ojs. He knows that on the ith oj, he made ai submissions. And what yo

hdu 4421 BitMagic

这是一道区域赛的题目,解法有许多,这边是2-sat的做法 题目大意:自己看题 分析:对于A[i]的每一位做2-SAT,判断是否可行. 主要是建图: 对于a&b=0  有 a-> ┐b, b-> ┐a a&b=1            ┐a->a , ┐b->b a|b=0            a-> ┐a,b-> ┐b a|b=1     ┐a->b, ┐b->a a^b=0 a->b,b->a, ┐a-> ┐b, ┐b-

C语言学习笔记:15_c语言中的进制操作.c

/* * 15_c语言中的进制操作.c * * Created on: 2015年7月5日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * c语言中的进制表示 * 前面加0b表示二进制 * 加0x表示十六进制 * 数字前加0表示八进制 * * printf按进制打印 * %d %i 以十进制打印 * %o 以八进制打印 * %x 以十六进制打印 * * %p 打印变量地址 * %f 打印小数 * %s

HDU 2100 Lovekey 模拟26进制

Problem Description XYZ-26进制数是一个每位都是大写字母的数字. A.B.C.-.X.Y.Z 分别依次代表一个0 ~ 25 的数字,一个 n 位的26进制数转化成是10进制的规则如下 A0A1A2A3-An-1 的每一位代表的数字为a0a1a2a3-an-1 ,则该XYZ-26进制数的10进制值就为 m = a0 * 26^(n-1) + a1 * 26^(n-2) + - + an-3* 26^2 + an-2*26 + an-1 一天vivi忽然玩起了浪漫,要躲在学校

二级制包安装Tomcat 与 RPM包安装Tomcat

1:下载二级制包 wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.47/bin/apache-tomcat-8.0.47.tar.gz 2:解压,且创建连接文件 tar xf apache-tomcat-8.0.47.tar.gz -C /usr/local ln -s /usr/local/apache-tomcat-8.0.47 /usr/local/tomcat 3:编辑/etc/profile.d/tomcat.sh文件

hdu 3001 Travelling TSP变形 三进制状压dp

// hdu 3001 TSP问题的变形 // 这次到每个点最多两次,所以可以用三进制的类推 // dp[S][u]表示当前在u点访问状态为S时所得到的最小的开销 // 采用刷表法,即用当前的状态推出它所能转移的状态 // dp[S][u] 可以到达的状态为dp[S+state[v]][v](dist[u][v]!=inf) // dp[S+state[v]][v] = max(dp[S+state[v]][v],dp[S][u]+dist[u][v]); // 其中每个点最多访问2次 // 技