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. 【一】,python简单爬虫实现

    一: 1.获取当前页的课程名称,地址:https://www.ichunqiu.com/courses/webaq 2.选取其中一门课程名称查看源代码: 代码如下: <p class=" ...

  2. 最新!2016中国城市GDP排名出炉

    2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...

  3. iframe子页面position的fixed

    前言: 首先说一说我昨天天的苦逼经历.中午吃饭时一同事跟我说,他做的项目嵌套iframe后,子页面的position设置fixed失效了. 经过反复询问,得知他用了两层iframe,再加上最外的父页面 ...

  4. Django_QueryDict

    介绍 class QueryDict(MultiValueDict): """ A specialized MultiValueDict which represents ...

  5. C++ 函数 函数的重载 有默认参数的函数

    函数的重载 C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同.这就是函数的重载(function overloading). int max1(int a,int b, int c ...

  6. 20162328蔡文琛 大二 十二周课上测试 hash

  7. web14 validation.xml配置 登录验证文件配置

    电影网站:www.aikan66.com 项目网站:www.aikan66.com 游戏网站:www.aikan66.com 图片网站:www.aikan66.com 书籍网站:www.aikan66 ...

  8. spring冲刺第四天

    昨天进行了地图的初步编写,但是存在BUG. 今天上网查找了错误的原因,改进了源代码,使程序可以执行. 遇到的问题;感觉地图界面太简单,需要作出更多的场景,这就需要不断的完善.

  9. myeclipse 导入 import maven web project

    用google才收到了这个.. http://stackoverflow.com/questions/12197662/maven-java-web-project-not-recognised-wh ...

  10. Beta 冲刺 (4/7)

    队名:日不落战队 安琪(队长) 过去两天完成了那些任务 完善已完成的界面. 接下来的任务 建立和上传收藏夹. 还剩下的任务 完善手写涂鸦. 遇到的困难 明天考试,准备通宵中. 有哪些收获和疑问 无. ...