题意:

      两个人玩剪刀石头布,他们玩了n把,给了你A这n把都出了什么,问你B能否会赢,其中A会限制B某些局数出的要相同,某些局数出的要不同,只要B满足他的限制,并且没没有输掉任何一把就算赢(没有输掉就是平或者赢)。

思路:

      首先考虑下,对于每一步,我们知道A出了什么,那么也就知道B在这不可以出什么,比如A在这一步出了1 那么B可以出1,2。对于每一步B都有两种选择,并且在步于步之间有一些限制,两种选择,一些限制,显然2sat,把每一次可以出的两个看成一组,一个是a,一个是~a,对于每一种限制我们只要找出它的矛盾对就行了,矛盾对的建边遵循 x ,y矛盾则有add(x ,~y) ,add(y ,~x) ,要注意这里面的
x,~x是相对而言,x = ~x^1 同时 x^1 = ~x,建边的时候别糊涂就行了,总之这个题目应该是2算是sat的简单题目。


#include<stdio.h>
#include<string.h>
#include<stack> #define N_node 20000 + 100
#define N_edge 50000 + 500

using namespace
std; typedef struct
{
int
to ,next;
}
STAR; STAR E1[N_edge] ,E2[N_edge];
int
list1[N_node] ,list2[N_node] ,tot;
int
Belong[N_node] ,cnt;
int
mark[N_node];
int
A[11000][2];
stack<int>st; void add(int a ,int b)
{

E1[++tot].to = b;
E1[tot].next = list1[a];
list1[a] = tot; E2[tot].to = a;
E2[tot].next = list2[b];
list2[b] = tot;
} void
DFS1(int s)
{

mark[s] = 1;
for(int
k = list1[s] ;k ;k = E1[k].next)
if(!
mark[E1[k].to])DFS1(E1[k].to);
st.push(s);
} void
DFS2(int s)
{

mark[s] = 1 ,Belong[s] = cnt;
for(int
k = list2[s] ;k ;k = E2[k].next)
if(!
mark[E2[k].to])DFS2(E2[k].to);
} bool
ok(int n)
{

memset(mark ,0 ,sizeof(mark));
while(!
st.empty()) st.pop();
for(int
i = 0 ;i < n * 2 ;i ++)
if(!
mark[i]) DFS1(i);
memset(mark ,0 ,sizeof(mark));
cnt = 0;
while(!
st.empty())
{
int
xin = st.top();
st.pop();
if(
mark[xin]) continue;
cnt ++;
DFS2(xin);
}
int
mk = 0;
for(int
i = 0 ;i < n * 2 && !mk ;i += 2)
if(
Belong[i] == Belong[i^1]) mk = 1;
return !
mk;
} int main ()
{
int
t ,n ,m ,i ,a ,b ,c ,cas = 1;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d %d" ,&n ,&m);
for(
i = 1 ;i <= n ;i ++)
{

scanf("%d" ,&a);
A[i][0] = a;
A[i][1] = a % 3 + 1;
}

memset(list1 ,0 ,sizeof(list1));
memset(list2 ,0 ,sizeof(list2));
tot = 1;
for(
i = 1 ;i <= m ;i ++)
{

scanf("%d %d %d" ,&a ,&b ,&c);
int
x1 = a * 2 ,x2 = a * 2 + 1;
int
y1 = b * 2 ,y2 = b * 2 + 1;
if(!
c && A[a][0] != A[b][0] || c && A[a][0] == A[b][0])
add(x1 ,y1^1) ,add(y1 ,x1^1);
if(!
c && A[a][0] != A[b][1] || c && A[a][0] == A[b][1])
add(x1 ,y2^1) ,add(y2 ,x1^1);
if(!
c && A[a][1] != A[b][0] || c && A[a][1] == A[b][0])
add(x2 ,y1^1) ,add(y1 ,x2^1);
if(!
c && A[a][1] != A[b][1] || c && A[a][1] == A[b][1])
add(x2 ,y2^1) ,add(y2 ,x2^1);
}

printf("Case #%d: " ,cas ++);
if(!
ok(n)) puts("no");
else
puts("yes");
}
return
0;
}

hdu4115 2sat的更多相关文章

  1. 2-sat(石头、剪刀、布)hdu4115

    Eliminate the Conflict Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  2. HDU-4115 Eliminate the Conflict 2sat

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4115 题意:Alice和Bob玩猜拳游戏,Alice知道Bob每次会出什么,为了游戏公平,Bob对Al ...

  3. 2-Sat问题

    二分+2-Sat 判断是否可行 输出字典序最小的解 输出字典序可行解 其实这些都是小问题,最重要的是建图,请看论文. 特殊的建边方式,如果a b是一对,a必须选,那么就是b->a建边. HDU ...

  4. UVALive 4849 String Phone(2-sat、01染色)

    题目一眼看去以为是4-sat... 题意:给n(n<=3000)个黑方块的坐标,保证黑方块没有公共边.对于每个黑方块选一个角作为结点,使得所选结点满足输入的一个无向图.其中距离为曼哈顿距离.输出 ...

  5. POJ 3683 Priest John's Busiest Day (2-SAT)

    题意:有n对新人要在同一天结婚.结婚时间为Ti到Di,这里有时长为Si的一个仪式需要神父出席.神父可以在Ti-(Ti+Si)这段时间出席也可以在(Di-Si)-Si这段时间.问神父能否出席所有仪式,如 ...

  6. UVa 1391 Astronauts (2SAT)

    题意:给出一些宇航员他们的年龄,x是他们的平均年龄,其中A任务只能给年龄大于等于x的人,B任务只能给小于x的人,C任务没有限制.再给出m对人,他们不能同任务.现在要你输出一组符合要求的任务安排. 思路 ...

  7. hdu 3622 Bomb Game(二分+2-SAT)

    Bomb Game Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. zoj 3717 - Balloon(2-SAT)

    裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...

  9. [BZOJ 1997][HNOI2010]Planar(2-SAT)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...

随机推荐

  1. PAT-1064(Complete Binary Search Tree)JAVA实现

    Complete Binary Search Tree PAT-1064 本次因为涉及到完全二叉排序树,所以可以使用数组的形式来存储二叉排序树 对输入序列排序后,得到的是中序遍历二叉排序树的序列.对这 ...

  2. System.Net.Mail邮件发送抄送附件(多个)

    /// <summary> /// 邮件发送抄送附件 /// </summary> /// <param name="mailTo">收件人(可 ...

  3. Python3+pygame中国象棋 代码完整 非常好 有效果演示

    这几天看到抖音上有个妹子下象棋超级猛,我的中国象棋也差不到哪去啊,走 做一个.... 一.运行效果 二.代码 下面的代码用到图片素材(images文件夹),下载地址如下:https://www.itp ...

  4. Netty源码 新连接处理

    上文我们阐述了Netty的Reactor模型.在Reactor模型的第二阶段,Netty会处理各种io事件.对于客户端的各种请求就是在这个阶段去处理的.本文便来分析一个新的连接是如何被处理的. 代码的 ...

  5. Codeforces Round #699 (Div. 2)

    A Space Navigation #include <bits/stdc++.h> using namespace std; typedef long long LL; #define ...

  6. Java 集合框架体系总览

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  7. java知识汇总

    文章目录 Java基础知识 基本类型 类别及其对应包装类 1. byte---Byte 2. char---Character 3. short---Short 4. int---Integer 5. ...

  8. 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】

    一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...

  9. 某SQL注入--报错注入payload

    1.证明存在sql注入,根据这个报错语句,,有'  有% 2.payload  闭合语句 %' or (select extractvalue("anything",concat( ...

  10. CSS垂直布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...