题目链接

题意看这吧。。https://www.cnblogs.com/wenruo/p/5885948.html

\(Solution\)

每对夫妇只能有一个坐在新娘这一边,这正符合2-SAT初始状态
若以0表示新娘,以1表示新郎
那么对于有关系的u,v(i'表示在新娘一侧),应该连边u->v',v->u',而不是用i'表示新娘对面(新郎一侧),而连边u'->v,v'->u
因为如果新郎与v有关系,就会连边1(u')->v',这成了同在新郎一侧了;但若新娘与v有关系,连边0(u)->v'(同在新娘一侧)是符合连边规则的
有矛盾的情况是有关系的两人同在新娘对面,所以2-SAT求出的可行解是新娘对面的
新娘与新郎要坐在两侧,连边0->1,表示不能选0,一定选1,这样选出来的解就是新娘对面了
每对夫妇就是对立的,也不分性别。。所以随便一个表示i,另一个就表示i'
输出方案时只要输出与新娘染色相同的就可以了

是bel[i]还是i不要混 注意与新郎新娘标号统一
总是有点想不明白。。

#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
const int N=5005,M=1e5+5;int n,m,Enum,H[N],nxt[M],to[M],sk[N],top,cnt,bel[N],low[N],dfn[N],id;
int num,head[N],snxt[N],sto[N],conf[N],dgr[N]/*indgree*/,col[N],q[N];//conflict
bool ins[N];inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void AddEdge(int u,int v){to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
}
inline void AddEdge2(int u,int v){++dgr[v], sto[++num]=v, snxt[num]=head[u], head[u]=num;
}
void Tarjan(int x)
{dfn[x]=low[x]=++id, sk[++top]=x, ins[x]=1;for(int v,i=H[x]; i; i=nxt[i])if(!dfn[v=to[i]]) Tarjan(v), low[x]=std::min(low[x],low[v]);else if(ins[v]) low[x]=std::min(low[x],dfn[v]);if(low[x]==dfn[x]){++cnt;do{bel[sk[top]]=cnt, ins[sk[top--]]=0;}while(x!=sk[top+1]);}
}
bool Topo()
{for(int i=0; i<n<<1; i+=2)if(bel[i]==bel[i^1]) return 0;else conf[bel[i]]=bel[i^1],conf[bel[i^1]]=bel[i];num=0, memset(head,0,sizeof head),memset(col,0,sizeof col), memset(dgr,0,sizeof dgr);for(int x=0; x<n<<1; ++x)for(int i=H[x]; i; i=nxt[i])if(bel[x]!=bel[to[i]]) AddEdge2(bel[to[i]],bel[x]);int h=0,t=0;for(int i=1; i<=cnt; ++i)if(!dgr[i]) q[t++]=i;while(h<t){int x=q[h++];if(!col[x]) col[x]=1,col[conf[x]]=2;for(int i=head[x]; i; i=snxt[i])if(!--dgr[sto[i]]) q[t++]=sto[i];}return 1;
}int main()
{while(n=read(),m=read(),n&&m){id=top=cnt=Enum=0, memset(H,0,sizeof H);memset(dfn,0,sizeof dfn);char c,d; int a,b,s,t;while(m--){scanf("%d%c %d%c",&a,&c,&b,&d);
//          s= c=='h'?a<<1:a<<1|1;//WA:这表示的man是2a,但是新郎也是man 是2a+1=1 s= c=='w'?a<<1:a<<1|1;t= d=='w'?b<<1:b<<1|1;AddEdge(s,t^1), AddEdge(t,s^1);}AddEdge(0,1);for(int i=0; i<n<<1; ++i)if(!dfn[i]) Tarjan(i);if(Topo()){for(int i=1; i<n; ++i)if(col[bel[i<<1]]==1) printf("%dh ",i);else printf("%dw ",i);putchar('\n');}else puts("bad luck");}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8487085.html

POJ.3648.Wedding(2-SAT)相关推荐

  1. [2-sat][topsort输出解] POJ 3648 Wedding

    2-sat 基本是有三类题型,一种只判定解是否存在,一种判定+二分答案求最佳,一种判定解并输出其中一组解. Wedding 这题是典型的第三种类型. ps. 最近太忙了,这题是前天A的,暂时先要把 2 ...

  2. POJ 3648 Wedding

    POJ_3648 首先要注意两个和算法无关地方:①题目的输入数据存在诸如"2w5h"的情况,因此直接用scanf("%s%s",b1,b2)去读取数据会WA.② ...

  3. (转)2-sat 专题

    [2-sat]专题- 2-sat是一个逻辑性很强的算法,但是其套路比较固定,所以不是很热,题目很少,但也不乏AC后让人大呼爽快的好题,下面放出两篇极品论文还有几道题目的题解以供交流-- 2-sat学习 ...

  4. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  5. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  6. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  7. 图论练习题(存起来练)

    =============================以下是最小生成树+并查集======================================  [HDU]  1213 How Man ...

  8. linux时间为什么没有北京,linux修改时区为中国时区(北京)

    [linux]linux下运行java程序 参考了http://www.cnblogs.com/howard-queen/archive/2012/01/30/2331795.html 第一步:用vi ...

  9. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

最新文章

  1. react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...
  2. 赠书:聊聊「分布式架构」那些事儿
  3. linux mpich配置_Linux下安装MPICH
  4. matlab 常用命令
  5. webservices系列(二)——JAX-WS文件上传下载
  6. nrf51822添加UUID
  7. Redis数据结构——跳跃表-skiplist
  8. 屏蔽关闭百度搜索风云热点的方法
  9. ANSI, unicode, UTF-8编码详解
  10. 学到一招!三行 Python 代码轻松提取 PDF 表格数据!
  11. 【python基础】h5py库的基本使用
  12. java正则表达式 and_Java正则表达式详解
  13. 微信小程序最新富文本编辑器使用功能实例教程
  14. 你的Android HTTPS真的安全吗?(转载)
  15. 主题 02:如何设计系统预案(Preplan)?
  16. 24bpp RGB对应的十六进制值和颜色(节选)
  17. Android 电池系统
  18. 动态拨号器linux,Linux 动态家庭宽带PPPoe拨号登陆教程
  19. 同伦算法matlab程序,一种新的基于Matlab环境的同伦路径跟踪算法
  20. 【Machine Learning in Action --4】朴素贝叶斯电子邮件垃圾过滤

热门文章

  1. Android -- 自定义StepView实现个人信息验证进度条
  2. javascript创建类方法汇总(包含es6语法)
  3. shell中的算数运算
  4. (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...
  5. 如何在一分钟内搞定面试官?
  6. Spring Boot中使用MongoDB数据库
  7. 【Scratch】青少年蓝桥杯_每日一题_6.01_画春花
  8. 【Python】青少年蓝桥杯_每日一题_3.05_排列组合
  9. gorm增删查改json_gorm 关联查询请教
  10. windows 2012 apache php mysql_Windows Server 2012 R2搭建 Apache+PHP+MYSQL环境