HDU 1814 Peaceful Commission (2-sat求字典序最小)

原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1814

思路:2-sat的裸题,这题因为是要求输出最小字典序的,所以不能使用拓扑排序求解,只能使用这种暴力染色法求解.

关于这题还有详细的ppt解释:https://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html

#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <cctype>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MOD 1e9+7
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define CLR(x,y) memset((x),y,sizeof(x))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 5;
int n, m;
/*
HDU 1814
暴力染色法, 2-sat求字典序最小,复杂度:O(nm)
如果是求字典序最大,那么就先考虑大的,每次先考虑奇数
*/
struct edge {//前向星建图
    int v, nxt;
} e[maxn];
int tot, head[maxn];
void add_edge(int u, int v) {
    e[tot].v = v;
    e[tot].nxt = head[u];
    head[u] = tot++;
}
int vis[maxn], top, S[maxn];
int dfs(int u) {
    if(vis[u ^ 1]) return 0;//如果一个节点的对立点已经被染色,那么这个节点再就不符合情况
    if(vis[u]) return 1;
    vis[u] = 1;
    S[top++] = u;//记录每一个染色的点,当不符合时,便于清空
    for(int i = head[u]; ~i; i = e[i].nxt) {
        int v = e[i].v;
        if(!dfs(v)) return 0;
    }
    return 1;
}
int twosat() {
    CLR(vis, 0);
    for(int i = 0; i < 2 * n; i += 2) {
        if(vis[i] || vis[i ^ 1]) continue;
        top = 0;
        if(!dfs(i)) {
            while(top) vis[S[--top]] = 0;
            if(!dfs(i ^ 1)) return 0;
        }
    }
    return 1;
}
int main() {
    while(~scanf("%d%d", &n, &m)) {
        tot = 0;
        CLR(head, -1);
        for(int i = 1; i <= m; i++) {
            int u, v;
            scanf("%d%d", &u, &v);
            u--;//这是因为节点是从1开始的,所以要减1便于后面位运算操作
            v--;
            add_edge(u, v ^ 1);//必须边存图
            add_edge(v, u ^ 1);
        }
        if(!twosat()) printf("NIE\n");
        else {
            for(int i = 0; i < 2 * n; i++) if(vis[i]) printf("%d\n", i + 1);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81357001