HDU 1814 Peaceful Commission (2-sat暴力染色)
2017-10-08 22:48
344 查看
题意:共和国要组建委员会,现在有N个党派,每个党派中有两人,而且有且只有一人能参加委员会,但是现在不同党派间有些人有矛盾,因此这些人是不能同时属于委员会的。现在要你求出每个党派的派出人选,如果有多组解,则输出字典序最小的那组解。
分析:直接暴力枚举DFS,首先将所有的点都置为为染色,然后我们从第一个点开始DFS染色,我们先尝试将i染
成红色(答案中的颜色),将~i染成蓝色,然后dfs i的所有后继并染色,如果对于后继j没有染色,那么将j然
后为红色,~j染成蓝色。如果后继j已经被染成蓝色,则说明不能选则i,如果j已经染成红色,则说明可以。
那么这些后继就可以被选择。如果选择i的时候失败了,那么必定要选择~i,如果也失败,则说明无解。否则
按次序选取下一个未被染色的点。时间复杂度O(nm)。
分析:直接暴力枚举DFS,首先将所有的点都置为为染色,然后我们从第一个点开始DFS染色,我们先尝试将i染
成红色(答案中的颜色),将~i染成蓝色,然后dfs i的所有后继并染色,如果对于后继j没有染色,那么将j然
后为红色,~j染成蓝色。如果后继j已经被染成蓝色,则说明不能选则i,如果j已经染成红色,则说明可以。
那么这些后继就可以被选择。如果选择i的时候失败了,那么必定要选择~i,如果也失败,则说明无解。否则
按次序选取下一个未被染色的点。时间复杂度O(nm)。
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 2e4 + 5; vector<int> vt[maxn]; int n, m, mark[maxn], sta[maxn], top; int dfs(int x) { if(mark[x^1]) return 0; if(mark[x]) return 1; mark[x] = 1; sta[top++] = x; for(int i = 0; i < vt[x].size(); i++) if(!dfs(vt[x][i])) return 0; return 1; } int solve() { for(int i = 0; i < 2*n; i += 2) { if(!mark[i] && !mark[i+1]) { top = 0; if(!dfs(i)) { while(top > 0) mark[sta[--top]] = 0; if(!dfs(i+1)) return 0; } } } return 1; } int main() { while(~scanf("%d%d", &n, &m)) { for(int i = 0; i < maxn; i++) vt[i].clear(); int x, y; for(int i = 0; i < m; i++) { scanf("%d%d", &x, &y); --x, --y; //从0开始, 这样 ^就是 奇数/偶数对应东西 vt[x].push_back(y^1); vt[y].push_back(x^1); } memset(mark, 0, sizeof(mark)); top = 0; if(!solve()) puts("NIE"); else { for(int i = 0; i < 2*n; i++) if(mark[i]) printf("%d\n", i+1); } } return 0; }
相关文章推荐
- hdoj 1814 Peaceful Commission 【2-sat暴力染色 求解字典序最小解】
- hdu 1814 Peaceful Commission(2-sat 染色)
- [2-SAT 字典序最小解 暴力dfs 模板题] HDU 1814 Peaceful Commission
- hdu 4751 Divide Groups(dfs染色 或 2-sat)
- [hdu 1814] Peaceful Commission(2-sat求最小序列可行解)
- HDU1814(2-SAT)
- [HDU1814]Peaceful Commission(2-SAT)
- hdu 3062 Party【2-SAT入门---强连通Tarjan+染色缩点】
- HDU 1814 Peaceful Commission(2-sat)
- HDU1814 2-sat 模板
- HDU 1814 Two_Sat
- hdu1814 Peaceful Commission 2-sat
- HDU - 1814 Peaceful Commission(一个粗暴的2-sat)
- hdu 1814 Peaceful Commission 2-SAT
- HDU 1814 2-sat 求字典序最小解
- hdu1814 Peaceful Commission 2-SAT
- hdu 1814 Peaceful Commission (2-SAT)
- Hdu 1814 Peaceful Commission(2-sat+输出字典序最小方案)
- HDU 1814 Peaceful Commission[2_SAT]
- HDU 1814 2-SAT