HDU 1814 模板题 2-sat
2013-08-16 19:08
369 查看
敲模板做的,不知道怎么就对了,注意一下建边即可···
贴代码:
View Code
贴代码:
#include<cstdio> #include<vector> using namespace std; #define N 16005 struct twosat { int n; vector<int> g[N*2]; bool vis[N*2]; int path[N*2]; int c; bool dfs(int x) { if(vis[x^1]) return false; if(vis[x]) return true; vis[x] =true; path[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(); vis[i] =0; } } void addEdge(int x,int y) { g[x].push_back(y^1); g[y].push_back(x^1); } bool solve() { for(int i=0; i<2*n; i += 2) { if(!vis[i] && !vis[i+1]) { c =0; if(!dfs(i)) { while(c > 0) vis[path[--c]] = false; if(!dfs(i+1)) return false; } } } return true; } }; twosat ts; int main() { // freopen("in.c","r",stdin); int n,m; while(~scanf("%d%d",&n,&m)) { ts.init(n); for(int i=0; i<m; ++i) { int u,v; scanf("%d%d",&u,&v); --u,--v; ts.addEdge(u,v); } if(ts.solve()) { for(int i=0; i<2*n; i+=2) printf("%d\n",(ts.vis[i]?i:i^1)+1); } else printf("NIE\n"); } return 0; }
View Code
相关文章推荐
- [2-SAT][POJ2683][HDU1814]2-SAT两种模板
- HDU1814 2-sat 模板
- HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方式)
- HDU 1814 Peaceful Commission(2-sat 模板题输出最小字典序解决方案)
- HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)
- [2-SAT 字典序最小解 暴力dfs 模板题] HDU 1814 Peaceful Commission
- HDU 1814 Two_Sat
- HDU 1814 Peaceful Commission(2-SAT)
- HDU 1814 Peaceful Commission 2-sat(字典序最小的解)
- HDU 1814 - 和平委员会(2-SAT)
- HDU 1814 2-sat 求字典序最小解
- 2-sat(求最小字典序 hdu 1814)
- HDU 3622 2-sat模板
- HDU 1814 2-SAT
- hdu1814 Peaceful Commission 2-sat
- HDU 3062 Party (2-SAT模板题)
- 2-SAT (染色法)—— Peaceful Commission (HDU 1814)
- hdu 1814 2-sat 输出字典最小的和任意序列的 模板题
- HDU1814(2-SAT)
- HDU 4421 & ZOJ 3556 Bit Magic(2-SAT 位运算 模板题)