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

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

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

 1 /**************************************************************
 2     Problem: 2199
 3     User: zhuohan123
 4     Language: C++
 5     Result: Accepted
 6     Time:140 ms
 7     Memory:1388 kb
 8 ****************************************************************/
 9
10 #include <iostream>
11 #include <cstdio>
12 #include <cstring>
13 #include <algorithm>
14 using namespace std;
15 int n,m;
16 struct point{int y,n;}p[1100];int pnum;
17 int head[2100];
18 struct edge{int next,to;}g[11000];int gnum;
19 void addedge(int from,int to)
20 {
21     g[++gnum].to=to;g[gnum].next=head[from];head[from]=gnum;
22 }
23 int q[2100],l,r;
24 bool cango[2100];
25 bool check(int po)
26 {
27     memset(cango,0,sizeof cango);
28     cango[po]=true;l=1;r=0;q[++r]=po;
29     while(l<=r)
30         for(int i=head[q[l++]];i;i=g[i].next)
31             if(!cango[g[i].to])cango[q[++r]=g[i].to]=true;
32     for(int i=1;i<=n;i++)
33         if(cango[p[i].y]&&cango[p[i].n])return false;
34     return true;
35 }
36 char ans[1100];
37 int main(int argc, char *argv[])
38 {
39     #ifndef ONLINE_JUDGE
40         freopen("1.in","r",stdin);
41         freopen("1.out","w",stdout);
42     #endif
43     scanf("%d%d",&n,&m);
44     for(int i=1;i<=n;i++)p[i].n=++pnum,p[i].y=++pnum;
45     while(m--)
46     {
47         int b,c;char vb[4],vc[4];
48         scanf("%d%s%d%s",&b,vb,&c,vc);
49         if(vb[0]=='Y'&&vc[0]=='Y')addedge(p[b].n,p[c].y),addedge(p[c].n,p[b].y);
50         if(vb[0]=='Y'&&vc[0]=='N')addedge(p[b].n,p[c].n),addedge(p[c].y,p[b].y);
51         if(vb[0]=='N'&&vc[0]=='Y')addedge(p[b].y,p[c].y),addedge(p[c].n,p[b].n);
52         if(vb[0]=='N'&&vc[0]=='N')addedge(p[b].y,p[c].n),addedge(p[c].y,p[b].n);
53     }
54     for(int i=1;i<=n;i++)
55     {
56         bool by=check(p[i].y),bn=check(p[i].n);
57         if(by&&bn)ans[i]='?';
58         else if(by)ans[i]='Y';
59         else if(bn)ans[i]='N';
60         else {puts("IMPOSSIBLE");return 0;}
61     }
62     puts(ans+1);
63     return 0;
64 }

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

转载于:https://www.cnblogs.com/zhuohan123/p/3285261.html

BZOJ2199: [Usaco2011 Jan]奶牛议会相关推荐

  1. BZOJ2199 [Usaco2011 Jan]奶牛议会

    首先建立一个2-SAT的裸模型,然后发现...tarjan没法判断'?'的情况 于是暴力对每一个议案check一下,直接dfs即可 1 /******************************* ...

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

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

  3. 「BZOJ2200」[Usaco2011 Jan] 道路和航线 - 最短路+拓扑排序

    ->点我进原题 [Usaco2011 Jan]道路和航线 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 1116 Solved: 410 Des ...

  4. 【ybt金牌导航3-6-3】【luogu P3007】奶牛议会 / The Continental Cowngress G(两种方法)

    奶牛议会 / The Continental Cowngress G 题目链接:ybt金牌导航3-6-3 / luogu P3007 题目大意 有一些人,每个人对众多决案中的两个决案有表示好或不好. ...

  5. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  6. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  7. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  8. 题目推荐—BZOJ 水题推荐

    [bzoj1756]Vijos1083小白逛公园 裸题- -..线段树维护lmax,rmax,max,sum然后搞之.. [Ahoi2008]Meet 紧急集合 求两两点的lca然后会发现必然有两个l ...

  9. BZOJ 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】

    1612: [Usaco2008 Jan]Cow Contest奶牛的比赛 Time Limit: 5 Sec Memory Limit: 64 MB Description FJ的N(1 <= ...

最新文章

  1. GSS-API GSSAPI 介绍 通用的安全机制
  2. 二叉树的链式存储结构--二叉链表
  3. 应用session对象实现用户登录
  4. 【问链-EOS公开课】第十四课 EOS从单签名到多签名
  5. illustrator条形码_Barcode Producer for Mac(创建条形码软件)
  6. Portal-Basic Java Web 应用开发框架:应用篇(十四) —— 异步 Action
  7. 《Raspberry Pi用户指南》——2.3 Debian简介
  8. nth-child和蝉原则实现的奇妙随机效果(译)
  9. STM32 利用空闲中断接收数据
  10. 在线可视化python网站_利用Python优雅地可视化数据
  11. 如何将Mac外部驱动器映射到CrossOver容器
  12. hdu4608 暴力+大数
  13. sql中取字符串长度的函数
  14. Palantir早期员工、连续创业者Brien Colwell:创业动力源自创造文化
  15. keras-segmentation-master代码详解
  16. 单调队列java_单调队列单调栈
  17. python 统计微信群未接龙
  18. 运用awk提取日志文件中的IP地址
  19. Verilog语言基础语法
  20. Docker常见使用

热门文章

  1. 非常不错的sharepoint webpart工具集
  2. SHELL编程一二三
  3. 小型车、中型车、大型车、重型车的区分和定义见下表:
  4. java 增量编译_java增量/全量编译接口应用
  5. gcc生成dll linux,gcc编译dll和调用dll
  6. MySQL 高级 while循环
  7. 分布式认证-技术方案
  8. java遍历目录下的包括子目录下的所有文件
  9. 对文本的内容进行排序
  10. Zuul使用正则表达式指定路由规则