当前位置: 首页 > news >正文

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-> ┐a

a^b=1    a-> ┐b,b-> ┐a, ┐a->b, ┐b->a

用Kosaraju算法会T(也许我写渣了)用Tarjan算法就ok╮(╯▽╰)╭

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <set>
  5 #include <algorithm>
  6 #include <map>
  7 #include<vector>
  8 using namespace std;
  9 const int MAXN = 2010;
 10 const int MAXM = 1010*501*2;
 11 struct Edge
 12 {
 13     int to,next;
 14 } edge[MAXM];
 15 int head[MAXN],tot;
 16 void addedge(int u,int v)
 17 {
 18     edge[tot].to = v;
 19     edge[tot].next = head[u];
 20     head[u] = tot++;
 21 }
 22 int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值1~scc
 23 int Index,top;
 24 int scc;
 25 bool Instack[MAXN];
 26 int num[MAXN];
 27 void init()
 28 {
 29     tot = 0;
 30     memset(head,-1,sizeof(head));
 31 }
 32 void Tarjan(int u)
 33 {
 34     int v;
 35     Low[u] = DFN[u] = ++Index;
 36     Stack[top++] = u;
 37     Instack[u] = true;
 38     for(int i = head[u]; i != -1; i = edge[i].next)
 39     {
 40         v = edge[i].to;
 41         if( !DFN[v] )
 42         {
 43             Tarjan(v);
 44             if(Low[u] > Low[v])Low[u] = Low[v];
 45         }
 46         else if(Instack[v] && Low[u] > DFN[v])
 47             Low[u] = DFN[v];
 48     }
 49     if(Low[u] == DFN[u])
 50     {
 51         scc++;
 52         do
 53         {
 54             v = Stack[--top];
 55             Instack[v] = false;
 56             Belong[v] = scc;
 57             num[scc]++;
 58         }
 59         while(v != u);
 60     }
 61 }
 62 int maps[1010][1010];
 63 bool solve(int m){
 64     for(int i=0;i<m;++i){
 65         for(int j=0;j<m;++j){
 66             if(i==j&&maps[i][j])return false;
 67             if(maps[i][j]!=maps[j][i])return false;
 68         }
 69     }
 70     for(int k=0;k<31;++k){
 71         init();
 72         for(int i=0;i<m;++i){
 73             for(int j=0;j<m;++j){
 74                 if(i==j)continue;
 75                 int is = maps[i][j]&(1<<k);
 76                 if((i&1)&&(j&1)){//|
 77                     if(is){//a|b=1
 78                         addedge(i,j+m);
 79                         addedge(j,i+m);
 80                     }
 81                     else{//a|b=0
 82                         addedge(i+m,i);
 83                         addedge(j+m,j);
 84                     }
 85                 }
 86                 else if((i%2==0)&&(j%2==0)){//&
 87                     if(is){//a&b=1
 88                         addedge(i,i+m);
 89                         addedge(j,j+m);
 90                     }
 91                     else{//a&b=0
 92                         addedge(i+m,j);
 93                         addedge(j+m,i);
 94                     }
 95                 }
 96                 else {//^
 97                     if(is){//a^b=1
 98                         addedge(i+m,j);
 99                         addedge(j+m,i);
100                         addedge(i,j+m);
101                         addedge(j,i+m);
102                     }
103                     else{//a^b=0
104                         addedge(i+m,j+m);
105                         addedge(j+m,i+m);
106                         addedge(i,j);
107                         addedge(j,i);
108 
109                     }
110                 }
111             }
112         }
113         memset(DFN,0,sizeof(DFN));
114         for(int i=0;i<2*m;++i){
115             if(!DFN[i])Tarjan(i);
116         }
117         for(int i=0;i<m;++i){
118             if(Belong[i]==Belong[m+i]){
119                 return false;
120             }
121         }
122     }
123     return true;
124 }
125 int main (){
126     int m;
127     while(scanf("%d",&m)!=EOF){
128         for(int i=0;i<m;++i){
129             for(int j=0;j<m;++j){
130                 scanf("%d",&maps[i][j]);
131             }
132         }
133         if(solve(m))printf("YES\n");
134         else printf("NO\n");
135     }
136 }
View Code

 

转载于:https://www.cnblogs.com/shuzy/p/3797256.html

相关文章:

  • 多线程异步执行脚本
  • QQ浏览器--x5内核定制meta标签说明
  • 【闲聊产品】之五:谁来背黑锅?
  • js 数组排除重复值(string)
  • 最简单的兼容firefox和ie的锚点方法
  • ENTBOOST 2014.180L发布,开源企业IM免费企业即时通讯
  • EXTJS项目实战经验总结一:日期组件的change事件:
  • [DevEpxress]GridControl 显示Gif动画
  • [逆向基础] 浮​点​数​到​二​进​制​的​转​换
  • 多线程:volatile
  • android网络编程——http post
  • linux文件和目录权限的设置
  • c/c++面试题(5)(c++重要的概念详解)
  • 执行计划基础 动态采样
  • 浅谈UML的概念和模型之UML九种图
  • ES学习笔记(12)--Symbol
  • IndexedDB
  • Mithril.js 入门介绍
  • nodejs调试方法
  • vue的全局变量和全局拦截请求器
  • 初探 Vue 生命周期和钩子函数
  • 从零搭建Koa2 Server
  • 搭建gitbook 和 访问权限认证
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 技术:超级实用的电脑小技巧
  • 使用 Docker 部署 Spring Boot项目
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 正则表达式小结
  • 组复制官方翻译九、Group Replication Technical Details
  • "无招胜有招"nbsp;史上最全的互…
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (九十四)函数和二维数组
  • (南京观海微电子)——I3C协议介绍
  • (三)c52学习之旅-点亮LED灯
  • (转)JAVA中的堆栈
  • (转)重识new
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 使用ajax控件后如何调用前端脚本
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net程序集学习心得
  • .NET构架之我见
  • .Net接口调试与案例
  • .net连接MySQL的方法
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .sys文件乱码_python vscode输出乱码
  • @font-face 用字体画图标
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!