Cod sursa(job #467243)

Utilizator ProtomanAndrei Purice Protoman Data 28 iunie 2010 13:28:20
Problema Andrei Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2 kb
#include <algorithm>
#include <stdio.h>
#include <vector>

#define MAX 100010
#define pb push_back
#define mp make_pair
#define f first
#define s second

using namespace std;

int n, m;
vector <int> vctViz;
vector <pair <int, int> > vctDrum[MAX];
int sol[MAX], pf[MAX];

int merge2sat(int nod, int cul)
{
    int ok = 1;

    if (pf[nod] == -1)
    vctViz.pb(nod);
    if (pf[nod] != -1 && pf[nod] != cul)
        return 0;
    else if (pf[nod] == cul)
        return 1;
    pf[nod] = cul;

    for (int i = 0; i < vctDrum[nod].size() && ok; i++)
    {
        if (cul == 0 && vctDrum[nod][i].s == 0)
            ok &= merge2sat(vctDrum[nod][i].f, 1);

        if (cul == 1 && vctDrum[nod][i].s == 1)
            ok &= merge2sat(vctDrum[nod][i].f, 0);

        if (vctDrum[nod][i].s == 2)
            ok &= merge2sat(vctDrum[nod][i].f, cul ^ 1);
    }

    return ok;
}

int main()
{
    freopen("andrei.in", "r", stdin);
    freopen("andrei.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for (int i = 1; i <= m; i++)
    {
        int n1, n2, c;
        scanf("%d %d %d", &n1, &n2, &c);

        vctDrum[n1].pb(mp(n2, c));
        vctDrum[n2].pb(mp(n1, c));
    }

    for (int i = 1; i <= n; i++)
    {
        pf[i] = -1;
        sol[i] = -1;
    }

    for (int i = 1; i <= n; i++)
        if (sol[i] == -1)
        {
            vctViz.clear();
            if (merge2sat(i, 0))
            {
                for (int j = 0; j < vctViz.size(); j++)
                    sol[vctViz[j]] = pf[vctViz[j]];
            }
            else
            {
                for (int j = 0; j < vctViz.size(); j++)
                    pf[vctViz[j]] = -1;
            }

            vctViz.clear();
            merge2sat(i, 1);

            for (int j = 0; j < vctViz.size(); j++)
                sol[vctViz[j]] = pf[vctViz[j]];
        }

    for (int i = 1; i <= n; i++)
        printf("%d ", sol[i]);

    fclose(stdin);
    fclose(stdout);
    return 0;
}