POJ 3648 Wedding(2-SAT输出一组解)
来源:互联网 发布:qt mysql数据库 编辑:程序博客网 时间:2024/05/16 03:51
题意:有新郎新娘举办婚礼,吃饭的时候大家坐在一长方形桌,桌子有两列,新娘坐一列上看对面一列,她定义以下事情会让她不开心:夫妻都在对面一列或有仇人在对面一列。问是否能安排出合理方案使得新娘开心。如果有,输出YES并且输出新娘这一列坐着的人,否则输出bad luck。
解法:夫妻不能在同一列,所以夫妻要不在新娘这排要不不在新娘这排,用2-SAT可以很好满足这个条件。然后读入仇人的信息,标记好,用2-sat判断下是否存在解即可。但是他是要输出和新娘同一排的人,那么想到之前做了一道2-sat输出最小字典序的模板,直接套上来用。
代码如下:
#include<iostream>#include<cstring>#include<cstdio>const int maxn = 50000 * 2;const int maxm = 500100;using namespace std;int n, m;int s[maxn], cnt;bool mark[maxn];int head[maxn], to[maxm << 1], nx[maxm << 1], tot;void addedge(int u, int v) { to[tot] = v, nx[tot] = head[u], head[u] = tot++;}void init() { tot = 0; memset(head, -1, sizeof(head)); memset(mark, 0, sizeof(mark));}bool dfs(int u) { if(mark[u ^ 1]) return false; if(mark[u]) return true; s[++cnt] = u; mark[u] = 1; for(int i = head[u]; ~i; i = nx[i]) { if(!dfs(to[i])) return false; } return true;}bool twosat() {mark[0] = 1; for(int i = 1; i <=n-1; i++){int u=i*2;if(mark[u]||mark[u+1])continue; cnt=0;if(!dfs(u)){while(cnt)mark[s[cnt--]]=0; if(!dfs(u+1)){return false;}}}return true;}int main() { while(scanf("%d%d", &n, &m) && n && m){ init(); while(m--) { int u, v; char c1, c2; scanf("%d%c%d%c", &u, &c1, &v, &c2); u = u * 2 + (c1 == 'h'); v = v * 2 + (c2 == 'h'); addedge(u ^ 1, v); addedge(v ^ 1, u); } if(twosat()) { for(int i = 1; i < n; i++) { printf("%d%c ", i, mark[i * 2] ? 'w' : 'h'); } printf("\n"); } else { printf("bad luck\n"); } } return 0;}
阅读全文
0 0
- POJ 3648 Wedding(2-SAT输出一组解)
- Wedding (poj 3648 2-SAT 输出任意一组解)
- POJ 3648 Wedding 2-sat输出一组解
- POJ 3648 Wedding(2-SAT+输出方案)
- Poj 3648 Wedding (2-sat 输出方案)
- poj 3648 Wedding 2-SAT输出
- poj 3648 2-sat输出一组解
- [2-sat][topsort输出解] POJ 3648 Wedding
- POJ 3648 Wedding (2-SAT+输出可行解)
- poj 3648 Wedding(2-sat--拓扑排序输出可行解)
- POJ 3648 Wedding(2-SAT + 输出方案)
- POJ 3648 Wedding(2-sat方案输出,4级)
- POJ 3648Wedding (2-SAT 输出路径)
- poj 3648 Wedding 【2-sat 经典建图 输出一组可行解 好题】 【tarjan求SCC + 缩点 + 拓扑排序 + 染色】
- POJ 3648 Wedding 2-SAT 输出任意一个2-sat解
- POJ 3648 Wedding(2-SAT)
- poj 3648 Wedding(2-sat)
- poj 3648 Wedding(2-SAT)
- bootstrap前台编码规范
- 在Textview中获取指定文字位置(兼顾网址链接和emoji表情),并在其附近展示图片
- node.js常用dos环境命令
- Cocos2dx杂记:cocos 编译命令拷贝so文件
- Hibernate查询语言(HQL)
- POJ 3648 Wedding(2-SAT输出一组解)
- 2017/10/15模拟赛总结
- nfs挂载根文件系统
- 【Vue】 vue2.0父子组件传递函数
- node安装
- vue开发:详解vue.js的devtools安装
- 最常用的DOS命令
- java SpringBoot启动加永无bug图
- NKeditor v5.0.2 发布,在线富文本编辑器