noip之前学的内容了,看到题竟然忘了怎么建图了,复习一下。

2-sat

大概是对于每个元素,它有0和1两种选择,必须选一个但不能同时选。这之间又有一些二元关系,比如x&y=1等等。。。

先把每个点拆成0和1两个点。

那么我们就建图,如果x等于A的话y必须等于B,那么从x的A点向y的B点连一条有向边,表示选了一个点它所有的后继点也必须选。

没有一组合法解的情况当且仅当x的01两个点缩点后在同一个强联通分量里。

bzoj 1823

裸题

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 205
#define M 4005
using namespace std;
int n,m;
int head[N],ver[M],nxt[M],tot;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int dfn[N],low[N],tim,in[N],st[N],top,cnt,be[N];
void dfs(int x)
{
dfn[x]=low[x]=++tim;
st[++top]=x;
in[x]=;
for(int i=head[x];i;i=nxt[i])
{
if(!dfn[ver[i]])
{
dfs(ver[i]);
low[x]=min(low[x],low[ver[i]]);
}
else if(in[ver[i]])
{
low[x]=min(low[x],dfn[ver[i]]);
}
}
if(low[x]==dfn[x])
{
cnt++;int y;
do
{
y=st[top--];
be[y]=cnt;
in[y]=;
}while(y!=x);
}
return ;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
tim=tot=cnt=top=;
memset(be,,sizeof(be));
memset(head,,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
scanf("%d%d",&n,&m);
char s1[],s2[];
for(int i=;i<=m;i++)
{
scanf("%s%s",s1,s2);
int k1,k2;k1=k2=;
int len1=strlen(s1);
for(int i=;i<len1;i++)
{
k1=k1*+s1[i]-'';
}
int len2=strlen(s2);
for(int i=;i<len2;i++)
{
k2=k2*+s2[i]-'';
}
int op1,op2;
if(s1[]=='m')op1=;else op1=;
if(s2[]=='m')op2=;else op2=;
add(k1+(op1^)*n,k2+op2*n);
add(k2+(op2^)*n,k1+op1*n);
}
for(int i=;i<=*n;i++)if(!dfn[i])dfs(i);
bool flag=;
for(int i=;i<=n;i++)if(be[i]==be[i+n])flag=;
if(flag)puts("BAD");
else puts("GOOD");
}
return ;
}

bzoj 2199

按2-sat建完图之后,从每个点开始dfs一遍。

如果一个点能访问到它的对立点说明这个点不能选。

如果x的两个点都不能选说明无解,相当于在同一个强联通分量里。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 2005
#define M 8005
using namespace std;
int n,m;
int head[N],ver[M],nxt[M],tot;
void add(int a,int b)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=b;return ;
}
int ans[N];
int v[N];
void dfs(int x)
{
v[x]=;
for(int i=head[x];i;i=nxt[i])
{
if(!v[ver[i]])dfs(ver[i]);
}
}
int main()
{
scanf("%d%d",&n,&m);
char s1[],s2[];
int t1,t2;
for(int i=;i<=m;i++)
{
scanf("%d",&t1);scanf("%s",s1);
scanf("%d",&t2);scanf("%s",s2);
int op1,op2;
if(s1[]=='Y')op1=;else op1=;
if(s2[]=='Y')op2=;else op2=;
add(t1+(op1^)*n,t2+op2*n);
add(t2+(op2^)*n,t1+op1*n);
}
bool flag=;
for(int i=;i<=n;i++)
{
int now=;
memset(v,,sizeof(v));
dfs(i);
if(v[i+n])now++;
memset(v,,sizeof(v));
dfs(i+n);
if(v[i])now+=;
ans[i]=now;
if(now==)flag=;
}
if(flag)puts("IMPOSSIBLE");
else
{
for(int i=;i<=n;i++)
{
if(!ans[i])putchar('?');
else if(ans[i]==)putchar('Y');
else putchar('N');
}
}
return ;
}

bzoj 1823: [JSOI2010]满汉全席 && bzoj 2199 : [Usaco2011 Jan]奶牛议会 2-sat的更多相关文章

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

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

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

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

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

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

  4. bzoj 2199: [Usaco2011 Jan]奶牛议会【2-SAT】

    好久没写2-SAT了啊,还以为是网络流 设点x为选,x'为不选,因为一头牛至少要满足一个条件,所以对于牛条件的两个点,选了一个不符合的点,就要选另一个符合的点,这样连两条边 然后枚举所有议案的选和不选 ...

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

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

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

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

  7. BZOJ 1823: [JSOI2010]满汉全席( 2-sat )

    2-sat...假如一个评委喜好的2样中..其中一样没做, 那另一样就一定要做, 这样去建图..然后跑tarjan. 时间复杂度O((n+m)*K) ------------------------- ...

  8. 【刷题】BZOJ 1823 [JSOI2010]满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  9. bzoj 1823: [JSOI2010]满汉全席

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],next[ ...

随机推荐

  1. jsp内置对象 转发与重定向的区别

    jsp 内置对象  转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...

  2. centos7.6 安装 openvpn--2.4.7

    openvpn-server端 搭建 1,软件版本 Centos - 7.x easy-rsa - 3.0.3 OpenVPN - 2.4.7 2,安装 建议安装启用epel源,采用yum的方式安装o ...

  3. 小刘的深度学习---CNN

    前言: 前段时间我在树莓派上通过KNN,SVM等机器学习的算法实现了门派识别的项目,所用到的数据集是经典的MNIST.可能是因为手写数字与印刷体存在一些区别,识别率并是很不高.基于这样的情况,我打算在 ...

  4. Python从菜鸟到高手:格式化字符串

    1. 字符串格式化基础 字符串格式化相当于字符串模板.也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(% ...

  5. JVM新生代老年代详解

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  6. Python之并发编程-多线程

    目录 一.threading模块介绍二.使用说明三.进一步介绍(守护线程,锁(互斥锁.递归锁),信号量,队列,event,condition,定时器) 1.守护线程 2.锁(互斥锁.递归锁) 3.信号 ...

  7. 王者荣耀交流协会final发布文案美工展示博客

    logo: 我们的logo是蓝底白字,非常简洁大气的设计感,上面印有我们的软件名称,更好的直观的彰显了我们的主题.我们的软件就是要迎合使用者,给使用者更加方便快捷的工作体验,更好的衡量自己的时间分配. ...

  8. 文献:Technology-related Disasters:A Survey toward Disaster-resilient Software Defined Networks

    DISASTER的定义和影响(本文中) 定义范围: 自然灾害,比如洪水.地震等造成一定范围类的节点故障: 恶意攻击,DDOS攻击或者电磁脉冲攻击造成节点故障: 技术相关的问题,配置错误或者误操作等: ...

  9. printf in KEIL C51

    转自:http://blog.csdn.net/it1988888/article/details/8821713 在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化 ...

  10. 深入理解JAVA I/O系列三:字符流详解

    字符流为何存在 既然字节流提供了能够处理任何类型的输入/输出操作的功能,那为什么还要存在字符流呢?容我慢慢道来,字节流不能直接操作Unicode字符,因为一个字符有两个字节,字节流一次只能操作一个字节 ...