HDU 1814 2-sat 入门
2014-07-15 13:32
405 查看
2014/7/15
我是彩笔系列
只会a+b
=...=高大上的2-sat,为了学它我先去A了a+b, sala了递归, 学了回溯,搞了tarjan _——>我是真 * 弱狗。
我是彩笔系列
只会a+b
=...=高大上的2-sat,为了学它我先去A了a+b, sala了递归, 学了回溯,搞了tarjan _——>我是真 * 弱狗。
#include<stdio.h> #include<string.h> #include<cmath> #include<algorithm> #include<iostream> #include<queue> #include<stack> #include<map> #include<climits> #include<vector> using namespace std; #define f(x,y,i) for(int i = x;i < y; i++) #define F(x,y,i) for(int i = x; i <= y; i++) #define lson pos<<1,l,mid #define rson pos<<1|1,mid+1,r #define sc(n) scanf("%d",&n) #define pr(n) printf("%d\n",n) #define met(n,m) memset(n, m, sizeof(n)) const int N=20000; vector<int>q ; int n, m , cnt; int l ,r; int ans ; int s ; void init() { f(0,N,i){ q[i].clear(); } met(s,0); } void read() { scanf("%d",&m); while(m--) { scanf("%d%d",&l,&r); r--; l--; q[r].push_back(l^1); q[l].push_back(r^1); } } bool dfs(int v) { if(s[v] == 1)return true; if(s[v] == 2)return false; s[v] = 1; s[v^1] = 2; ans[cnt++] = v; int len = q[v].size(); f(0,len,i) { if(!dfs(q[v][i]))return false; } return true; } bool solve() { f(0,n,i) { if(s[i])continue; cnt = 0; if(!dfs(i)) { f(0,cnt,j) { s[ans[j]]=0; s[ans[j]^1]=0; } if(!dfs(i^1))return false; } } return 1; } int main() { while(~scanf("%d",&n)) { n<<=1; //学霸爷说这样写显得很有学问。 init(); read(); if(solve()) { f(0,n,i) { if(s[i] == 1) { pr(i+1); } } } else printf("NIE\n"); } }
相关文章推荐
- hdu 1814 Peaceful Commission (2-sat入门)
- hdu 1814 和平委员会(2-sat入门题 字典序最小解)
- hdu 1824 Let's go home(2-sat入门)
- hdu-3062(2-SAT入门)
- 2-sat入门(tarjan)hdu(3062)
- HDU 1814 Peaceful Commission(2-SAT:最小字典序)
- hdu 3062+1824(2-sat入门)
- HDU 3715 2-SAT入门
- hdu1814 Peaceful Commission 2-sat
- HDU 1814 Peaceful Commission (2-SAT按字典序输出方案)
- hdu 3062 2-Sat入门
- HDU 1814 Two_Sat
- HDU 3062 Party (2-SAT入门学习)
- hdu 3062 Party 2-SAT入门
- HDU 1814 2-sat 求字典序最小解
- HDU 1814 Peaceful Commission(2-SAT)
- hdu 3062 Party 2-SAT入门
- hdu 3062 2-sat入门题
- [hdu 1814] Peaceful Commission(2-sat求最小序列可行解)
- 【HDU】1814 Peaceful Commission 2-sat