POJ - 3905 Perfect Election(2-SAT)
2015-09-09 20:38
302 查看
题目大意:题意挺好理解的
解题思路:就按照题意来建边就可以了
解题思路:就按照题意来建边就可以了
[code]#include <cstdio> #include <cstring> #include <vector> using namespace std; const int MAXNODE = 2010; vector<int> G[MAXNODE]; bool mark[MAXNODE * 2]; int Stack[MAXNODE * 2]; int n, m, top; void AddClause(int x, int xval, int y, int yval) { x = x * 2 + xval; y = y * 2 + yval; G[x].push_back(y); } void init() { n++; for (int i = 0; i < 2 * n; i++) G[i].clear(); memset(mark, 0, sizeof(mark)); char s1[15], s2[15]; char sign1, sign2; int x, valx, y, valy; for (int i = 0; i < m; i++) { scanf("%s%s", s1, s2); sscanf(s1, "%c%d", &sign1, &x); sscanf(s2, "%c%d", &sign2, &y); valx = (sign1 == '+' ? 1 : 0); valy = (sign2 == '+' ? 1 : 0); AddClause(x, valx ^ 1, y, valy); AddClause(y, valy ^ 1, x, valx); } } bool dfs(int u) { if (mark[u ^ 1]) return false; if (mark[u]) return true; mark[u] = true; Stack[++top] = u; for (int i = 0; i < G[u].size(); i++) if (!dfs(G[u][i])) return false; return true; } void solve() { for (int i = 2; i < 2 * n; i += 2) { if (!mark[i] && !mark[i^1]) { top = 0; if (!dfs(i)) { while (top) mark[Stack[top--]] = false; if (!dfs(i ^ 1)) { printf("0\n"); return ; } } } } printf("1\n"); } int main() { while (scanf("%d%d", &n, &m) != EOF) { init(); solve(); } return 0; }
相关文章推荐
- 剑指Offer系列---(11)旋转数组的最小数字
- JSTL标签 参考手册
- BZOJ 1028: [JSOI2007]麻将 暴力
- 如何去设计一个自适应的网页设计或HTMl5
- 前端开发工具即测试环境搭建
- [剑指offer]替换空格
- boost property tree 解析Json ini
- [转载]前端工程——基础篇
- LeetCode -- Remove Nth Node from End of List
- extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
- gulp打包seajs,用gulp-cmd-pack打包seajs模块
- jQuery EasyUI Datagrid性能优化专题(转)
- java 版 jquery jcrop截图并上传
- Nodejs课堂笔记-第二课 package.json的作用
- jsp页面出现end tag "&lt;/c:forEach" is unbalanced
- jQuery EasyUI Datagrid VirtualScrollView视图简单分析
- 【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports
- jquery 使用 xhrFields 来获取下载进度的方法
- A JavaScript Image Gallery
- Ext js学习笔记(二) 表格的创建