Mn Zn 2-Sat 60pts求助
查看原帖
Mn Zn 2-Sat 60pts求助
817044
cjwdyzxfblzs楼主2023/8/4 14:46

后面几个点没有对,不知道是哪里出来了问题啊。

#include <bits/stdc++.h>
#define int long long
const int N = 2e6;
int n, m; int ans[N];
int h[N], e[N], ne[N], idx;
int stk[N], top, in_stk[N];
int timestamp, dfn[N], low[N];
int size[N], scc_cnt, id[N];
inline void add(int a, int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++ ;
}
void tarjan(int u)
{
    dfn[u] = low[u] = ++ timestamp;
    stk[ ++ top] = u; in_stk[u] = true;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (!dfn[j])
        {
            tarjan(j);
            low[u] = std::min(low[u], low[j]);
        }
        else if (in_stk[j])
            low[u] = std::min(low[u], dfn[j]);
    }
    if (dfn[u] == low[u])
    {
        int y;
        scc_cnt ++ ;
        do
        {
            y = stk[top -- ];
            in_stk[y] = false;
            id[y] = scc_cnt;
            size[scc_cnt] ++ ;
        } while (y != u);
    }
}
signed main()
{
    memset(h, -1, sizeof(h));
    std::cin >> n >> m;
    while (m -- )
    {
        int i, a, j, b;
        std::cin >> i >> a >> j >> b;
        add((2 * i + a) ^ 1, 2 * j + b);
        add((2 * j + b) ^ 1, 2 * i + a); 
    }
    for (int i = 2; i <= (n << 1 | 1); i ++ )
        if (!dfn[i]) tarjan(i);
    for (int i = 1; i <= n; i ++ )
    {
        if (id[i << 1] == id[i << 1 | 1])
        {
            std::cout << "IMPOSSIBLE" << std::endl;
            exit(0);
        }
        else if (id[i << 1] > id[i << 1 | 1])
            ans[i] = 1;
        else ans[i] = 0;
    }
    std::cout << "POSSIBLE" << std::endl;
    for (int i = 1; i <= n; i ++ )
        std::cout << ans[i] << " ";
    std::cout << std::endl;
    return 0;
}
2023/8/4 14:46
加载中...