【bzoj1823】[JSOI2010]满汉全席 2-sat

来源:互联网 发布:电磁场与无线技术 知乎 编辑:程序博客网 时间:2024/04/27 15:32

学习一下2-sat

算法流程如下:

1、建图,图具有对称性(对于有限制的A,从A‘向A连边)

2、tarjan算法缩点

3、判断是否有解:若存在一组A和A'在同一个强连通分量中,则无解

4、缩点后,建反图

5、拓扑排序,若当前点A未标记,则选择A,对应的,标记A’;若当前点A标记了,则沿着边传递标记


本题是裸题


#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>#define maxn 20100using namespace std;int head[maxn],to[maxn],next[maxn];bool vis[maxn];int dfn[maxn],low[maxn],st[maxn],bel[maxn];int n,m,T,top,num,cnt,tot;char s1[5],s2[5];int cal(char *s){int x=0,n=strlen(s+1);for (int i=2;i<=n;i++) x=x*10+s[i]-'0';return x;}void addedge(int x,int y) {num++;to[num]=y;next[num]=head[x];head[x]=num;}void tarjan(int x){st[++top]=x;vis[x]=1;dfn[x]=low[x]=++tot;for (int p=head[x];p;p=next[p])  if (!dfn[to[p]]) tarjan(to[p]),low[x]=min(low[x],low[to[p]]);  else if (vis[to[p]]) low[x]=min(low[x],dfn[to[p]]);if (dfn[x]==low[x]){cnt++;while (st[top+1]!=x){bel[st[top]]=cnt;vis[st[top]]=0;top--;}}}int main(){scanf("%d",&T);while (T--){num=top=tot=cnt=0;memset(st,0,sizeof(st));memset(head,0,sizeof(head));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(vis,0,sizeof(vis));scanf("%d%d",&n,&m);for (int i=1;i<=m;i++){scanf("%s%s",s1+1,s2+1);int op1=(s1[1]=='m'),x1=cal(s1),op2=(s2[1]=='m'),x2=cal(s2);addedge((!op1)*n+x1,op2*n+x2);addedge((!op2)*n+x2,op1*n+x1);}for (int i=1;i<=2*n;i++) if (!dfn[i]) tarjan(i);bool flag=1;for (int i=1;i<=n;i++) if (bel[i]==bel[i+n]) {flag=0;printf("BAD\n");break;}if (flag) printf("GOOD\n");}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魔域手游幻兽亲密度过低怎么办 移动账号被锁定怎么办 魔域手游账号被冻结怎么办 魔域手游没用的装备怎么办 5173账号三年找回怎么办 电脑的任务栏不见了怎么办 减肥出现瓶颈期怎么办 减肥到瓶颈期怎么办 减脂皮肤松弛怎么办 减肥期间上火了怎么办 涂了瘦身霜好辣怎么办 站起来就头晕怎么办 蹲了起来头晕怎么办 蛙跳后大腿疼怎么办 头低久了脖子痛怎么办 边防武警改革义务兵怎么办 家门钥匙丢了怎么办 森警改革士官怎么办 武警改制后士兵怎么办 消防改革时新兵怎么办 腈纶衣服染色了怎么办 部队新兵体能训练不及格怎么办 做足疗私处有了反应怎么办 跑步跑不起来怎么办 28岁有抬头纹怎么办? 眼睛近视加散光怎么办 眼睛近视又散光怎么办 眼睛近视有散光怎么办 眼睛不近视散光怎么办 孩子眼睛近视散光怎么办 小孩眼睛散光近视怎么办 眼睛近视和散光怎么办 考军校体能不行怎么办 高中体测不及格怎么办 刚开始跑步腿疼怎么办 刚跑步腿酸痛怎么办 小孩走路像鸭子怎么办 走完鸭子步腿疼怎么办 宝宝走路右脚往外撇怎么办 1岁宝宝罗圈腿怎么办 宝宝走路腿弯怎么办