题意:两个人石头剪刀布,一个人的出法已确定,另一个人的出法有一定约束,某两次要相同或者不同,问你第二个人能否全部都不失败。

思路:根据Bob出的情况,我们可以确定每次Alice有两种方案。

R与P,S矛盾,P与R,S矛盾,S与R,P矛盾。

根据Bob出的情况建边:

如果Bob出的是石头(R)则Alice可以出石头或者布,就是~R与~P矛盾,~P与~R矛盾,建边~R—>P,~P—>R。

........................................

根据约束条件:

如果a,b两轮是一样的就是Ra与~Rb矛盾,Rb与~Ra矛盾,建边Ra—>Rb,Rb—>Ra,

........................................

如果a,b两轮不一样就是Ra与Rb矛盾,Rb与Ra矛盾,建边Ra—>~Rb,Rb—>~Ra,

.......................................

#include<stdio.h>
#include<string.h>
#include<stack>
const int N=61000;
using namespace std;
int head[N],num,low[N],dfs[N],idx,ans,belong[N],ins[N];
stack<int>Q;
struct edge
{
int st,ed,next;
}e[N*10];
void addedge(int x,int y)
{
e[num].st=x;e[num].ed=y;e[num].next=head[x];head[x]=num++;
}
void Tarjan(int u)//缩点
{
int i,v;
Q.push(u);
ins[u]=1;
low[u]=dfs[u]=idx++;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].ed;
if(dfs[v]==-1)
{
Tarjan(v);
low[u]=low[u]>low[v]?low[v]:low[u];
}
else if(ins[v]==1)
low[u]=low[u]>dfs[v]?dfs[v]:low[u];
}
if(dfs[u]==low[u])
{
do
{
v=Q.top();
Q.pop();
ins[v]=0;//又忘了这个,调了半天
belong[v]=ans;
}while(v!=u);
ans++;
}
}
int main()
{
int i,x,y,a[3],b[3],c,t,op=1,k,n,m;
scanf("%d",&t);
while(t--)
{
memset(head,-1,sizeof(head));
num=0;
scanf("%d%d",&n,&m);
k=3*n;
for(i=1;i<=n;i++)
{
a[0]=i;a[1]=a[0]+n;a[2]=a[1]+n;
addedge(a[0],k+a[1]);addedge(a[0],k+a[2]);//R->非P,R->非S
addedge(a[1],k+a[0]);addedge(a[1],k+a[2]);//P->非R,P->非S
addedge(a[2],k+a[0]);addedge(a[2],k+a[1]);//S->非R,s->非R
}
for(i=1;i<=n;i++)
{
a[0]=i;a[1]=a[0]+n;a[2]=a[1]+n;
scanf("%d",&x);
if(x==3)//Bob出的是剪刀
{
addedge(k+a[0],a[2]);//非R->P
addedge(k+a[2],a[0]);//非P->R
}
else
{
addedge(k+a[x],a[x-1]);
addedge(k+a[x-1],a[x]);
}
}
for(i=0;i<m;i++)
{
scanf("%d%d%d",&x,&y,&c);
a[0]=x;a[1]=a[0]+n;a[2]=a[1]+n;
b[0]=y;b[1]=b[0]+n;b[2]=b[1]+n;
if(c==0)
{
addedge(a[0],b[0]);addedge(b[0],a[0]);
addedge(a[1],b[1]);addedge(b[1],a[1]);
addedge(a[2],b[2]);addedge(b[2],a[2]); }
else
{
addedge(a[0],k+b[0]);addedge(b[0],k+a[0]);
addedge(a[1],k+b[1]);addedge(b[1],k+a[1]);
addedge(a[2],k+b[2]);addedge(b[2],k+a[2]);
}
}
memset(dfs,-1,sizeof(dfs));
idx=0,ans=0;
memset(belong,0,sizeof(belong));
memset(ins,0,sizeof(ins));
for(i=1;i<=k+k;i++)
{
if(dfs[i]==-1)
Tarjan(i);
}
for(i=1;i<=n;i++)
{
a[0]=i;a[1]=a[0]+n;a[2]=a[1]+n;
if(belong[a[0]]==belong[a[0]+k])break;
if(belong[a[1]]==belong[a[1]+k])break;
if(belong[a[2]]==belong[a[2]+k])break;
}
printf("Case #%d: ",op++);
if(i<=n)
printf("no\n");
else printf("yes\n");
}
return 0;
}

hdu 4115 (2—SAT)的更多相关文章

  1. HDU 4115 Eliminate the Conflict(2-sat)

    HDU 4115 Eliminate the Conflict pid=4115">题目链接 题意:Alice和Bob这对狗男女在玩剪刀石头布.已知Bob每轮要出什么,然后Bob给Al ...

  2. hdu 4115 Eliminate the Conflict ( 2-sat )

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

  3. hdu 4115 2-SAT判定

    思路:将每个回合的平手和赢最为一对对立状态.那么后面就是2-SAT判断了. #include<iostream> #include<cstdio> #include<al ...

  4. hdu 4115 石头剪子布(2-sat问题)

    /* 意甲冠军:石头剪子布,目前已知n周围bob会有什么,对alice限制.供u,v,w:设w=0说明a,b回合必须出的一样 否则,必须不一样.alice假设输一回合就输了,否则就赢了 解: 2-sa ...

  5. HDU 4115 Eliminate the Conflict

    2-SAT,拆成六个点. #include<cstdio> #include<cstring> #include<cmath> #include<stack& ...

  6. Eliminate the Conflict HDU - 4115(2-sat 建图 hhh)

    题意: 石头剪刀布 分别为1.2.3,有n轮,给出了小A这n轮出什么,然后m行,每行三个数a b k,如果k为0 表示小B必须在第a轮和第b轮的策略一样,如果k为1 表示小B在第a轮和第b轮的策略不一 ...

  7. HDU 4115 Eliminate the Conflict(2-SAT)(2011 Asia ChengDu Regional Contest)

    Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...

  8. [GodLove]Wine93 Tarining Round #4

    比赛链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=44903#overview 题目来源: 2011 Asia ChengDu R ...

  9. 【图论】2-sat总结

    2-sat总结 2-sat问题,一般表现的形式为.每一个点有两种方式a,b,要么选a,要么选b.而且点点之间有一些约束关系.比如:u和v至少一个选a.那么这就是一个表达式.把a当成真,b当成假,那就是 ...

随机推荐

  1. codeforces #310 div1 B

    我们考虑n-1座桥每座桥需要的长度在一个区间[L,R]中 之后我们现在有m座桥,每个桥的长度为k 题意就是要求一个匹配方案 显然如果数据范围不大直接KM就可以了 可是20w的数据KM显然要T 所以我们 ...

  2. 使用头文件cfloat中的符号常量获知浮点类型数据的表数范围---gyy整理

    使用头文件cfloat中的符号常量获知浮点类型数据的表数范围 cfloat头文件包含了系统的浮点数的长度限制 头文件climits中的符号常量是获知整型数据的表数范围,并不能获取浮点类型数据的表数范围 ...

  3. mysql查看数据库命令

    mysql查看数据库命令 打开的数据库的命令 mysql> use mysql Database changed 查看数据库的命令 mysql> show databases; 查看数据表 ...

  4. 转:tar 常用命令

    tar在linux上是常用的打包.压缩.加压缩工具,他的参数很多,折里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数: -x : 解压缩压缩档案的参数: -z : 是 ...

  5. POJ3260——The Fewest Coins(多重背包+完全背包)

    The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...

  6. 1136. Parliament(二叉树)

    1136 先由后左 再父 建一个二叉树 #include <iostream> #include<cstdio> #include<cstring> #includ ...

  7. 使用委托的BeginInvoke方法来完成复杂任务的操作

    现在假设我有这样一个窗体(包含一个进度条和一个按钮与两个文本框),在第一个文本框中输入一个数字进行阶乘运算,在此过程中进度条与运算进度保持一致,同时可以在第二个文本框中进行其它工作(比如输入).对付这 ...

  8. js不能执行,IE处理方法

    一.如果你的ie不能打开js脚本(连系统里所有的js文件都不运行,网页上的js广告或好多页面都显示不了),请按一下步骤进行排查与解决: 1.查看是否IE的安全里面禁止了JS的运行: 将工具=>i ...

  9. Nhibernate与Dapper对比,及Nhibernate增删改和9种查询语法

    1,Sql语法. NH:HQL Dapper:原生Sql. 点评:原生Sql可以直接放在数据库里执行,Hql不行,且Hql增加学习负担.(Hn也可以原生Sql,但好像用的不多呀) 2,开发速度. NH ...

  10. Struts2的struts.properties文件在哪儿啊?

    老师教我们Struts2的时候叫我们建了个Struts.xml文件啊?那struts.properties呢?不需要吗? 回答1: struts.properties 是可以不要的!!!因为 stru ...