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. 论文笔记:分形网络(FractalNet: Ultra-Deep Neural Networks without Residuals)

    FractalNet: Ultra-Deep Neural Networks without Residuals ICLR 2017 Gustav Larsson, Michael Maire, Gr ...

  2. 基于Linux-3.9.4内核增加简单的时间片轮转功能

    简单的时间片轮转多道程序内核代码 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 作者:sa18225465 一.安装 Linux-3.9.4 ...

  3. php 常用英语小汇

    bstract抽象的 -挨伯丝拽克特 access存取.访问 -挨克色丝 account账户 -厄靠恩特 action动作 -爱克身 activate激活 -爱克特维特 active活动的 -爱克得 ...

  4. vim 多个文件切换 :b 命令

    MiniBufExplorer插件的使用 博客分类: vim vimMiniBufExplorer 快速浏览和操作Buffer -- 插件: MiniBufExplorer 下载地址 [http:// ...

  5. [BUAA OO]第一次博客作业

    第一次作业 第一次进行面向对象的编程,不论是针对数据设计类还是对方法进行合适的归于不同类中,都不是很熟悉.所写出来的程序还是面向过程+有函数的类(虽然现在很大程度上感觉起来也是这样).索性作业难度并不 ...

  6. 第二阶段每日站立会议First Day

    昨天我进行了用户界面的修改,例如按钮的大小,位置,使界面看起来更美观.更简洁 今天准备安装在手机端进行界面效果测试以及进一步完善 遇到的问题:有些按钮由于在之前固定好的布局之中,所以没法移动其位置

  7. C#和.net框架

    第一章C#和.net框架 c#只是.net的一部分,.net不只包含C#.C#是一种程序语言,.net是一个框架/平台 C#和.NET框架 在.NET之前 20世纪90年代,微软平台多数程序员使用VB ...

  8. 【转】 MATLAB下如何指定GPU资源

    [转] MATLAB下如何指定GPU资源 原文链接

  9. sprint冲刺(第二天)

    今天的每日立会是在早上早餐后8点在宿舍讨论的,大概讨论了关于四则运算练习器APP的看法,也对一些较为基础的功能进行说明

  10. Beta冲刺 (7/7)

    队名:天机组 组员1友林 228(组长) 今日完成:封装代码 明天计划: 剩余任务:优化网络通讯机制 主要困难:暂无 收获及疑问:暂无 组员2方宜 225 今日完成:优化了一部分活动 明天计划:剩余活 ...