|算法讨论|2-SAT 学习笔记
2017-02-04 23:22
411 查看
题目
[2-SAT]BZOJ 1823:2-SAT经典模型
[2-SAT]BZOJ 2199:2-SAT经典模型
[2-SAT, 二分]poj 2723:二分后建2-SAT图判断可行性
[2-SAT, 二分]Hdu 3622:浮点数二分后2-SAT判断可行性
[2-SAT, 二分]poj 2749:二分后建2-SAT图判断可行性(建图较复杂)
[2-SAT]poj 3207:经典2-SAT问题(建图较复杂)
[2-SAT]poj 3678:2-SAT问题(建图较复杂)
[2-SAT]poj 3648:2-SAT输出方案问题(建图较复杂)
[2-SAT]poj 3683:2-SAT输出方案问题(建图较复杂)
[2-SAT, 二分]poj 2296:二分后2-SAT(建图较复杂)
模板及讲解
加边a->b 代表选了a的话b也得选
例如 x->x` 表示选了x就必须选x` ,所以这个值必为x
2-SAT模板题:BZOJ 2199[Usaco2011 Jan]奶牛议会
[2-SAT]BZOJ 1823:2-SAT经典模型
[2-SAT]BZOJ 2199:2-SAT经典模型
[2-SAT, 二分]poj 2723:二分后建2-SAT图判断可行性
[2-SAT, 二分]Hdu 3622:浮点数二分后2-SAT判断可行性
[2-SAT, 二分]poj 2749:二分后建2-SAT图判断可行性(建图较复杂)
[2-SAT]poj 3207:经典2-SAT问题(建图较复杂)
[2-SAT]poj 3678:2-SAT问题(建图较复杂)
[2-SAT]poj 3648:2-SAT输出方案问题(建图较复杂)
[2-SAT]poj 3683:2-SAT输出方案问题(建图较复杂)
[2-SAT, 二分]poj 2296:二分后2-SAT(建图较复杂)
模板及讲解
加边a->b 代表选了a的话b也得选
例如 x->x` 表示选了x就必须选x` ,所以这个值必为x
2-SAT模板题:BZOJ 2199[Usaco2011 Jan]奶牛议会
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> #define ms(i,j) memset(i,j, sizeof i); using namespace std; const int MAXN = 1000 + 5; const char orz[10] = {'Y', 'N', '?'}; int n,m; int ans[MAXN]; struct twoSAT//这里标号从0开始 { vector<int> G[MAXN*2];//邻接表 bool mark[MAXN*2];//每个点是否被标记 int n; int init(int ni)//初始化 { n = ni; for (int i=0;i<2*n;i++) G[i].clear(); } int addEdge(int x, int y, int xv, int yv)//加一个条件 { x = x*2+xv; y = y*2+yv; G[x^1].push_back(y); G[y^1].push_back(x);//2i是假,2i+1是真 } int dfs(int x) { if (mark[x^1]) return false;//对应点被标记,不符合要求 if (mark[x]) return true;//已经被标记直接返回 mark[x] = true;//标记 for (int i=0;i<G[x].size();i++)//继续标记 { if (!dfs(G[x][i])) return false; } return true; } int check(int x)//检查一个议案是否通过 { ms(mark, false); return dfs(x); } }ts; int main() { scanf("%d%d", &n,&m); ts.init(n); for (int i=0;i<m;i++) { int bi,ci; char vbi,vci; scanf("%d %c %d %c", &bi,&vbi,&ci,&vci); int vvbi = false, vvci = false; if (vbi=='Y') vvbi = true; if (vci=='Y') vvci = true; ts.addEdge(bi-1,ci-1,vvbi,vvci); } for (int i=0;i<n;i++) { int p = ts.check(i*2); int q = ts.check(i*2+1); if (!p&&!q) {printf("IMPOSSIBLE"); return 0;} if (p&&q) ans[i] = 2; else if (!p) ans[i] = 0; else ans[i] = 1; } for (int i=0;i<n;i++) putchar(orz[ans[i]]); return 0; }
相关文章推荐
- |算法讨论|差分约束 学习笔记
- |算法讨论|平衡树 学习笔记
- |算法讨论|树链剖分 学习笔记
- |算法讨论|KMP 学习笔记
- |算法讨论|Trie树 学习笔记
- |算法讨论|后缀数组 学习笔记
- |算法讨论|AC自动机 学习笔记
- |算法讨论|最短路 学习笔记
- |算法讨论|数论数学 学习笔记
- |算法讨论|RMQ 学习笔记
- |算法讨论|LCA 学习笔记
- |算法讨论|状压DP/位运算 学习笔记
- |算法讨论|树状数组 学习笔记
- |算法讨论|并查集 学习笔记
- |算法讨论|Hash表 学习笔记
- |算法讨论|无向图割点和桥 学习笔记
- |算法讨论|贪心算法 学习笔记
- |算法讨论|二分查找 学习笔记
- |算法讨论|单调队列 学习笔记
- |算法讨论|线段树2 学习笔记