趁此机会学了一下2-SAT。

以前的2-SAT都是用并查集写的,只能应用于极小的一部分情况,这次学了一正式的2-SAT,是用一张有向图来表示其依赖关系。

2-SAT的介绍参见刘汝佳《训练指南》。

 /**************************************************************
Problem: 2199
User: zhuohan123
Language: C++
Result: Accepted
Time:140 ms
Memory:1388 kb
****************************************************************/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
struct point{int y,n;}p[];int pnum;
int head[];
struct edge{int next,to;}g[];int gnum;
void addedge(int from,int to)
{
g[++gnum].to=to;g[gnum].next=head[from];head[from]=gnum;
}
int q[],l,r;
bool cango[];
bool check(int po)
{
memset(cango,,sizeof cango);
cango[po]=true;l=;r=;q[++r]=po;
while(l<=r)
for(int i=head[q[l++]];i;i=g[i].next)
if(!cango[g[i].to])cango[q[++r]=g[i].to]=true;
for(int i=;i<=n;i++)
if(cango[p[i].y]&&cango[p[i].n])return false;
return true;
}
char ans[];
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)p[i].n=++pnum,p[i].y=++pnum;
while(m--)
{
int b,c;char vb[],vc[];
scanf("%d%s%d%s",&b,vb,&c,vc);
if(vb[]=='Y'&&vc[]=='Y')addedge(p[b].n,p[c].y),addedge(p[c].n,p[b].y);
if(vb[]=='Y'&&vc[]=='N')addedge(p[b].n,p[c].n),addedge(p[c].y,p[b].y);
if(vb[]=='N'&&vc[]=='Y')addedge(p[b].y,p[c].y),addedge(p[c].n,p[b].n);
if(vb[]=='N'&&vc[]=='N')addedge(p[b].y,p[c].n),addedge(p[c].y,p[b].n);
}
for(int i=;i<=n;i++)
{
bool by=check(p[i].y),bn=check(p[i].n);
if(by&&bn)ans[i]='?';
else if(by)ans[i]='Y';
else if(bn)ans[i]='N';
else {puts("IMPOSSIBLE");return ;}
}
puts(ans+);
return ;
}

P.S.这个代码写的相当非主流啊!

BZOJ2199: [Usaco2011 Jan]奶牛议会的更多相关文章

  1. BZOJ2199: [Usaco2011 Jan]奶牛议会(2-SAT)

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 559  Solved: 360[Submit][Status][Discuss] Descriptio ...

  2. BZOJ2199[Usaco2011 Jan]奶牛议会——2-SAT+tarjan缩点

    题目描述 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 <= M ...

  3. 【BZOJ2199】[Usaco2011 Jan]奶牛议会 2-SAT

    [BZOJ2199][Usaco2011 Jan]奶牛议会 Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要 ...

  4. BZOJ 2199: [Usaco2011 Jan]奶牛议会

    2199: [Usaco2011 Jan]奶牛议会 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 375  Solved: 241[Submit][S ...

  5. 【BZOJ2199】 [Usaco2011 Jan]奶牛议会

    Description 由于对Farmer John的领导感到极其不悦,奶牛们退出了农场,组建了奶牛议会.议会以“每头牛 都可以获得自己想要的”为原则,建立了下面的投票系统: M只到场的奶牛 (1 & ...

  6. BZOJ 2199: [Usaco2011 Jan]奶牛议会 [2-SAT 判断解]

    http://www.lydsy.com/JudgeOnline/problem.php?id=2199 题意:裸的2-SAT,但是问每个变量在所有解中是只能为真还是只能为假还是既可以为真又可以为假 ...

  7. BZOJ.2199.[USACO2011 Jan]奶牛议会(2-SAT)

    题目链接 建边不说了.对于议案'?'的输出用拓扑不好判断,直接对每个议案的结果DFS,看是否会出现矛盾 Tarjan也用不到 //964kb 76ms #include <cstdio> ...

  8. 2199: [Usaco2011 Jan]奶牛议会 2-sat

    链接 https://www.luogu.org/problemnew/show/P3007 https://www.lydsy.com/JudgeOnline/problem.php?id=2199 ...

  9. bzoj 1823: [JSOI2010]满汉全席 && bzoj 2199 : [Usaco2011 Jan]奶牛议会 2-sat

    noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下. 2-sat 大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选.这之间又有一些二元关系,比如x&y=1等等... 先把 ...

随机推荐

  1. static 与 final 修饰符

    A) 用static(静态)修饰属性:一个类生成了N个对象,这些对象会共同使用一份静态的成员变量.一个对象对这个成员变量进行修改,其他对象的该成员变量的值也会随之变化. B) 我们可以通过 类名.成员 ...

  2. 比支付宝更好用的读IC卡信息工具

    编程语言:VC++ 更新时间:2014.10.23 操作系统:windowAll 工具:PCSC读卡器 在上一个博文<<解惑:NFC手机如何轻松读取银行卡信息?>>中,介绍了支 ...

  3. oracle - redo 损坏或删除处理方法

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  4. Xcode全局断点

    1.将导航器视图切换到断点导航器视图下,也可以用快捷键Command+7一步搞定,键盘是window风格的用户Command键是win键(有微软logo),然后点击左下角的+号,选择Add Symbo ...

  5. win7虚拟打印驱动开发注意事项

    win7虚拟打印驱动开发注意事项 通过控制面板安装遇到以下问题:错误1.提示“Printer driver was not installed. Operation could not be comp ...

  6. Labview实现单边带信号调制(SSB)[滤波法]

    Labview实现单边带信号调制(SSB)[滤波法] 首先用信号仿真器得到一个被调制信号m(t),以及载波信号,该实验选择正弦信号作为载波信号. 根据调制器模型 得到一个结果信号. 其中,H(w)的选 ...

  7. Introduction to Haskell

    "I know why you're here. ...why you hardly sleep, why night after night, you sit by your comput ...

  8. KinectStudio使用教程

    在Kinect SDK 2.0安装结束之后,会有一个KinectStudio的调试工具,他可以将动作记录下,以后即便脱离了Kinect传感器也可以愉快的调试了.现在我们来看看如何使用 首先打开Kine ...

  9. 微软职位内部推荐-Software Engineer II-Data Mini

    微软近期Open的职位: Are you looking for a big challenge? Do you know why Big Data is the next frontier for ...

  10. 修改ptrace_scope

    需要将kernel.yama.ptrace_scope=1 改为kernel.yama.ptrace_scope=0 文件位于/etc/sysctl.d/目录下 修改后需要用sysctl -p /et ...