Cod sursa(job #592476)

Utilizator ProtomanAndrei Purice Protoman Data 28 mai 2011 14:40:47
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 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 (vctDrum[nod][i].s == cul)
            ok &= merge2sat(vctDrum[nod][i].f, cul ^ 1);

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

    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;
}