[UOJ]210 寻找罪犯 2-Sat 前缀和优化
2017-12-08 17:14
316 查看
把一个点拆成四个点(罪犯点,非罪犯点,真话点,假话点), 然后前缀和优化2-Sat即可(变为之前全真话点,之前有假话点). 不过看网上说判解可以用scc判? 一发改了后rk1.
#include<bits/stdc++.h> #define acce register int #define boc register char using namespace std; const int maxn = 5e5 + 5; int all, n, m, num, cnt, top, idx, ret; int h[maxn], scc[maxn], low[maxn], s[maxn], p[maxn], dfn[maxn], pre[maxn]; inline const int read() { acce x = 0; boc ch = getchar(); while (ch < '0' || ch > '9') ch = getchar(); while (ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + ch - '0', ch = getchar(); return x; } struct edge{ int nxt, v; }e[maxn * 2]; inline void add(int u, int v) { e[++ num].v = v, e[num].nxt = h[u], h[u] = num; e[++ num].v = u ^ 1, e[num].nxt = h[v ^ 1], h[v ^ 1] = num; } void dfs(int u) { s[++ top] = u; low[u] = dfn[u] = ++ idx; for (acce i = h[u]; i; i = e[i].nxt) { int v = e[i].v; if (!dfn[v]) dfs(v), low[u] = min(low[u], low[v]); else if (!scc[v]) low[u] = min(low[u], dfn[v]); } if (dfn[u] == low[u]) { ++ cnt; while (s[top + 1] != u) scc[s[top --]] = cnt; } } inline const int id(const int &x, const int &d) { return x << 1 | d;} inline const int say(const int &x, const int &d) { return (n + x) << 1 | d;} int main() { acce i, x, y, t; n = read(), m = read(); all = say(m + 1, 1) + 1; for (i = 1; i <= n; ++ i) pre[i] = 1; for (i = 2; i <= m + 1; ++ i) { x = read(), y = read(), t = read(), t = !t; add(id(y, !t), say(pre[x], 1)); add(say(i, 1), id(y, t)); add(say(i, 1), say(pre[x], 1)); pre[x] = i; } for (i = 1; i <= n; ++ i) add(say(pre[i], 0), id(i, 1)); for (i = all; i; -- i) if (!dfn[i]) dfs(i); for (i = 1; i <= all; i += 2) if (scc[i] == scc[i ^ 1]) return puts("Impossible"), 0; for (i = 1; i <= n; ++ i) if (scc[id(i, 1)] < scc[id(i, 0)]) p[++ ret] = i; printf("%d\n", ret); for (i = 1; i <= ret; ++ i) printf("%d ", p[i]); return 0; }
相关文章推荐
- [UOJ210]-寻找罪犯-前缀边优化2-SAT
- UOJ #210. 【UER #6】寻找罪犯 2-sat 前缀优化建边 详解
- UOJ210【UER #6】寻找罪犯 (2-SAT前后缀优化建边)
- 【UOJ #210】【UER #6】寻找罪犯 (2-SAT)
- uoj #210. 【UER #6】寻找罪犯 2-SAT
- 【UOJ #210】【UER #6】寻找罪犯 (2-sat 详解)
- UOJ 210 [UER #6]寻找罪犯
- UOJ#210. 【UER #6】寻找罪犯 2-sat
- 【CF587D】Duff in Mafia 二分+前缀优化建图+2-SAT
- [二分 前缀优化建图 2-SAT] Codeforces 587D. Duff in Mafia
- 【2-SAT+前缀优化建图】BZOJ3495 PA2010 Riddle
- [二分答案 2-SAT验证 前缀后缀优化建图 线段树优化建图] Codeforces gym 100159 Facebook Hacker Cup 2012 I. Unfriending
- [线段树 & 前缀 优化建图 二分 2-SAT] CF Gym100159 facebook-hacker-cup-2012 I. Unfriending
- [BZOJ]3495 Riddle 2-Sat 前缀和优化
- bzoj3495 PA2010 Riddle(2-SAT 前缀优化建边)
- BZOJ.3495.[PA2010]Riddle(2-SAT 前缀优化建图)
- lightoj 1145 - Dice (I) 前缀和优化DP
- CF - 712D 差值dp + 前缀和优化
- HDU 5550 dp + 前缀和优化
- poj1056 (Trie入门)寻找字符串前缀