HDU1824-Let's go home(2-SAT)
来源:互联网 发布:setscale java 编辑:程序博客网 时间:2024/04/28 18:04
题目链接
题意:n个队伍,一个队伍3个人,要求如果队长不在那剩下两个队员必须在,如果剩下两个队员不在队长必须在。m种冲突关系,每种冲突关系中的两个人不能同时存在,问方案是否可行。
思路:利用矛盾关系建图,用2-SAT求解。注意每对冲突关系中,至少有一个要留下来。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int MAXN = 5005;struct TwoSAT{ int n; vector<int> g[MAXN * 2]; bool mark[MAXN * 2]; int s[MAXN * 2], c; 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 < n * 2; i++) g[i].clear(); memset(mark, 0, sizeof(mark)); } 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 < n * 2; 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 main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) { solver.init(n * 3); int a, b, c; for (int i = 0; i < n; i++) { scanf("%d%d%d", &a, &b, &c); solver.add_clause(a, 1, b, 1); solver.add_clause(a, 1, c, 1); } for (int i = 0; i < m; i++) { scanf("%d%d", &a, &b); solver.add_clause(a, 0, b, 0); } if (solver.solve()) printf("yes\n"); else printf("no\n"); } return 0;}
0 0
- HDU1824-Let's go home(2-SAT)
- hdu1824 Let's go home--2-sat
- hdu1824 Let's go home (2-sat)
- Hdu1824 Let's go home(2-sat)
- HDU1824 Let's go home
- HDU_1824 Let's go home 2-Sat
- HDU 1824 Let's go home 2-sat
- hdu 1824 Let's go home(2-sat入门)
- HDU 1824 Let's go home (2-SAT)
- HDU 1824 Let's go home (2-SAT判断)
- HDU 1824 Let's go home(2-SAT)
- Hdu 1824 Let's go home (2-sat 可行性判定)
- Let's go home+hdu+2sat问题的求解
- 【HDU】1824 Let's go home 2-sat
- HDU 1824 Let's go home(2-sat)
- HDU 1824 Let's go home (2-SAT)
- hdoj 1824 Let's go home 【2-sat 简单题目】
- HDU - 1824 Let's go home(2-SAT)
- Poj 3254 Corn Fields(状态压缩)
- 卡片式UI的总结 android
- 第十一周项目6 (4)输入一个数,输出这个数以内的所有回文素数
- 第一天
- 不确定水平滚动条的循环滚动的实现。
- HDU1824-Let's go home(2-SAT)
- Mac 10.10 安装nginx
- android开发规范
- Linked List Cycle I,II, Partition List
- 藤田麻衣子 覚悟を決めて。
- 整除一个整数的方法
- HDU 1072 ACboy needs your help again!(栈和队列)
- 有关Entity Framework的数据模型的操作(二)业务层
- Emacs安装R开发环境ESS