Cod sursa(job #1945938)

Utilizator akaprosAna Kapros akapros Data 29 martie 2017 19:40:23
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define maxN 200005
using namespace std;

FILE *fin = freopen("andrei.in", "r", stdin);
FILE *fout = freopen("andrei.out", "w", stdout);

/* ============== */
int n, m;
/* ============== */
vector < int > V[maxN], T[maxN];
bool vis[maxN];
int ts[maxN];
/* ============== */
int ans;
bool val[maxN];

int Not(int x)
{
    if (x <= n)
        return x + n;
    return x - n;
}

void addEdge(int x, int y)
{
    V[Not(x)].push_back(y);
    T[y].push_back(Not(x));
    V[Not(y)].push_back(x);
    T[x].push_back(Not(y));
}
void dfs(int x)
{
    vis[x] = 1;
    for (int nod : V[x])
        if (!vis[nod])
            dfs(nod);
    ts[++ ts[0]] = x;
}

void dfsT(int x)
{
    int nod;
    vis[x] = 0;
    if (val[x])
    {
        ans = 0;
        return ;
    }
    val[Not(x)] = 1;
    for (int nod : T[x])
        if (vis[nod])
            dfsT(nod);
}

void Ctc2Sat()
{
    ans = 1;
    for (int i = 1; i <= 2 * n; ++ i)
        if (!vis[i])
            dfs(i);

    for (int i = ts[0]; i > 0; -- i)
        if (vis[ts[i]] && vis[Not(ts[i])])
            dfsT(ts[i]);
}

int main()
{
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; ++ i)
    {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        if (!z)
            addEdge(x, y);
        else if (z == 1)
            addEdge(Not(x), Not(y));
        else
        {
            addEdge(Not(x), y);
            addEdge(x, Not(y));
        }
    }
    Ctc2Sat();
    for (int i = 1; i <= n; ++ i)
        printf("%d ", val[i]);
    return 0;
}