UVA - 11294 Wedding(2-SAT)
来源:互联网 发布:喜马拉雅网络无法连接 编辑:程序博客网 时间:2024/05/22 11:40
题目大意:有N-1对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧。由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人。任意一对夫妻不能坐在桌子的同侧,另外有m对人吵过架,而新娘不希望看到两个吵过架的人坐在他的对面,问如何安排这些座位
解题思路:设mark[2*i]被标记时表示的是第i对夫妻的妻子跟新娘坐在同一侧,mark[2 * i + 1]被标记时表示的是第i对夫妻的丈夫跟新娘坐同一侧
设吵架的两人是i和j
如果吵过架的人都是女的,那么就要满足(2 * i) V (2 * j)
如果吵过架的人都是男的,那么就要满足(2 * i + 1) V (2 * j + 1)
如果i个是女的,j个是男的,就要满足(2 * i) V (2 * j + 1)
如果i个是男的,j个是女的,就要满足(2 * i + 1) V (2 * j)
注意:有可能吵过架的人里面会有要结婚的夫妻,所以初始,输出,状态表示时要注意
细节挺多的
#include <cstdio>#include <cstring>#include <vector>using namespace std;#define N 4010#define INF 0x3f3f3f3fstruct TwoSAT{ int n, c; vector<int> G[N]; bool mark[N]; int S[N]; bool dfs(int x) { if (mark[x ^ 1]) return false; if (mark[x]) return true; mark[x] = true; S[c++] = x; for (int i = 0; i < G[x].size(); i++) if (!dfs(G[x][i])) return false; return true; } void init(int n) { this->n = n; for (int i = 0; i < 2 * n; i++) G[i].clear(); memset(mark, 0, sizeof(mark)); mark[0] = 1; } //x == xval or y == yval void add_clause(int x, int xval, int y, int yval) { x = x * 2 + xval; y = y * 2 + yval; G[x^1].push_back(y); G[y^1].push_back(x); } bool solve() { for (int i = 0; i < 2 * n; i += 2) { if (!mark[i] && !mark[i + 1]) { c = 0; if (!dfs(i)) { while (c > 0) mark[S[--c]] = false; if (!dfs(i + 1)) return false; } } } return true; }};TwoSAT solver;int n, m;void init() { solver.init(n); int u, v, valu, valv; char a, b; for (int i = 0; i < m; i++) { scanf("%d%c %d%c", &u, &a, &v, &b); valu = (a == 'w') ? 0: 1; valv = (b == 'w') ? 0: 1; solver.add_clause(u, valu, v, valv); } if (!solver.solve()) { printf("bad luck\n"); } else { for (int i = 1; i < n; i++) { if (i != 1) printf(" "); printf("%d%c", i, solver.mark[2 * i] ? 'w': 'h'); } printf("\n"); }}int main() { while (scanf("%d%d", &n, &m) != EOF) { init(); } return 0;}
0 0
- UVA - 11294 Wedding(2-SAT)
- Uva 11294 Wedding(2-SAT)
- UVA 11294 Wedding(2-sat)
- UVa 11294 - Wedding(2-SAT)
- uva 11294 - Wedding(2 sat)
- (beginer)DFS (2-SAT) UVA 11294 Wedding
- UVa 11294 Wedding (two SAT 输出解)
- POJ_3648 Wedding 2-Sat
- UVA11294-Wedding(2-SAT)
- POJ3648 Wedding 【2-SAT】
- poj3648 Wedding 2-sat
- poj 3648 Wedding 2sat
- poj 3648 Wedding 2-SAT
- 2-sat->poj 3648 Wedding
- POJ 3648 Wedding(2-SAT)
- 【POJ】3648 Wedding 2-sat
- poj 3648 Wedding 2-sat
- POJ 3648 Wedding 2-SAT
- 汽车内部清洗具有哪些?
- Paint与Canvas(形状工具本质都是调用画笔工具)
- sendRedirect和getRequestDispatcher().forward()的一些区别
- 我的ROS入门(四):ROS文件系统
- Sonatype nexus 搭建本地私服
- UVA - 11294 Wedding(2-SAT)
- 咕嘟咕嘟,香味冒出来
- 汽车内部清洗的部位有哪些
- Python找出多个连续的空闲端口
- Hibernate学习笔记(三) — Hibernate 的一级缓存意义
- python2.7和pip在linux下的安装详解
- One day 假期萌妹纸护肤日志
- HTML中的进度条标签的应用<progress>
- Android 的消息机制