POJ.3648.Wedding(2-SAT)
题目链接
题意看这吧。。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)相关推荐
- [2-sat][topsort输出解] POJ 3648 Wedding
2-sat 基本是有三类题型,一种只判定解是否存在,一种判定+二分答案求最佳,一种判定解并输出其中一组解. Wedding 这题是典型的第三种类型. ps. 最近太忙了,这题是前天A的,暂时先要把 2 ...
- POJ 3648 Wedding
POJ_3648 首先要注意两个和算法无关地方:①题目的输入数据存在诸如"2w5h"的情况,因此直接用scanf("%s%s",b1,b2)去读取数据会WA.② ...
- (转)2-sat 专题
[2-sat]专题- 2-sat是一个逻辑性很强的算法,但是其套路比较固定,所以不是很热,题目很少,但也不乏AC后让人大呼爽快的好题,下面放出两篇极品论文还有几道题目的题解以供交流-- 2-sat学习 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 一系列图论问题[转]
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- 图论练习题(存起来练)
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Man ...
- linux时间为什么没有北京,linux修改时区为中国时区(北京)
[linux]linux下运行java程序 参考了http://www.cnblogs.com/howard-queen/archive/2012/01/30/2331795.html 第一步:用vi ...
- [kuangbin]各种各样的题单
[kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...
最新文章
- react中使用构建缓存_通过构建海滩度假胜地网站,了解如何使用React,Contentful和Netlify...
- 赠书:聊聊「分布式架构」那些事儿
- linux mpich配置_Linux下安装MPICH
- matlab 常用命令
- webservices系列(二)——JAX-WS文件上传下载
- nrf51822添加UUID
- Redis数据结构——跳跃表-skiplist
- 屏蔽关闭百度搜索风云热点的方法
- ANSI, unicode, UTF-8编码详解
- 学到一招!三行 Python 代码轻松提取 PDF 表格数据!
- 【python基础】h5py库的基本使用
- java正则表达式 and_Java正则表达式详解
- 微信小程序最新富文本编辑器使用功能实例教程
- 你的Android HTTPS真的安全吗?(转载)
- 主题 02:如何设计系统预案(Preplan)?
- 24bpp RGB对应的十六进制值和颜色(节选)
- Android 电池系统
- 动态拨号器linux,Linux 动态家庭宽带PPPoe拨号登陆教程
- 同伦算法matlab程序,一种新的基于Matlab环境的同伦路径跟踪算法
- 【Machine Learning in Action --4】朴素贝叶斯电子邮件垃圾过滤
热门文章
- Android -- 自定义StepView实现个人信息验证进度条
- javascript创建类方法汇总(包含es6语法)
- shell中的算数运算
- (多图)老弟,你连HTTPS 原理都不懂,还给我讲“中间人攻击”,逗我吗...
- 如何在一分钟内搞定面试官?
- Spring Boot中使用MongoDB数据库
- 【Scratch】青少年蓝桥杯_每日一题_6.01_画春花
- 【Python】青少年蓝桥杯_每日一题_3.05_排列组合
- gorm增删查改json_gorm 关联查询请教
- windows 2012 apache php mysql_Windows Server 2012 R2搭建 Apache+PHP+MYSQL环境