Poj 3905 perfect election
Question Link
Idea: A very bare 2-sat, just create an edge based on the meaning of the question
Code:
#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <algorithm>using namespace std;const int MAXNODE = 2005;struct TwoSet {int n;vector<int> g[MAXNODE * 2];bool mark[MAXNODE * 2];int S[MAXNODE * 2], sn;void init(int tot) {n = tot * 2;for (int i = 0; i < n; i += 2) {g[i].clear();g[i^1].clear();}memset(mark, false, sizeof(mark));}void add_Edge(int u, int uval, int v, int vval) {u = u * 2 + uval;v = v * 2 + vval;g[u^1].push_back(v);g[v^1].push_back(u);}void delete_Edge(int u, int uval, int v, int vval) {u = u * 2 + uval;v = v * 2 + vval;g[u^1].pop_back();g[v^1].pop_back();}bool dfs(int u) {if (mark[u^1]) return false;if (mark[u]) return true;mark[u] = true;S[sn++] = u;for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!dfs(v)) return false;}return true;}bool solve() {for (int i = 0; i < n; i += 2) {if (!mark[i] && !mark[i + 1]) {sn = 0;if (!dfs(i)){for (int j = 0; j < sn; j++)mark[S[j]] = false;sn = 0;if (!dfs(i + 1)) return false;}}}return true;}} gao;int n, m;int main() {while (~scanf("%d%d", &n, &m)) {gao.init(n);int u, v;while (m--) {scanf("%d%d", &u, &v);if (u > 0 && v > 0) {u--; v--;gao.add_Edge(u, 1, v, 1);} else if (u > 0 && v < 0) {v = -v;u--; v--;gao.add_Edge(u, 1, v, 0);} else if (u < 0 && v > 0) {u = -u;u--; v--;gao.add_Edge(u, 0, v, 1);} else if (u < 0 && v < 0) {u = -u; v = -v;u--; v--;gao.add_Edge(u, 0, v, 0);}}printf("%d\n", gao.solve());}return 0;}
Poj 3905 perfect Election (2-Sat)