Cod sursa(job #1068591)

Utilizator romircea2010FMI Trifan Mircea Mihai romircea2010 Data 28 decembrie 2013 15:24:07
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
#include <vector>
#define NMax 100010
#define MMax 200010
#define WHITE 0
#define RED 1
#define PURPLE 2

using namespace std;

bool ans[2*NMax];
bool existaSol;
int n, m;
vector <int> G[2*NMax], GT[2*NMax];
bool viz[2*NMax];
int p[2*NMax], np;

inline int neg(const int x)
{
    if (x <= n)
        return n + x;
    return x - n;
}

inline void Add(const int x, const int y)
{
    G[neg(x)].push_back(y);
    G[neg(y)].push_back(x);
    GT[y].push_back(neg(x));
    GT[x].push_back(neg(y));
}

void Read()
{
    ifstream f ("andrei.in");
    f>>n>>m;
    for (int i = 1; i<=m; ++i)
    {
        int x, y, color;
        f>>x>>y>>color;
        switch(color)
        {
            case WHITE:
                // !x || !y daca A == 1 doar ca A == 0 si deci facem x || y
                Add(x, y);
                break;
            case RED:
                // x || y  daca B == 0 doar ca B == 1 si deci facem !x || !y
                Add (neg(x), neg(y));
                break;
            case PURPLE:
                // (!x || y) && (x || !y)
                Add(neg(x), y);
                Add(x, neg(y));
                break;
        }
    }
    f.close();
}

inline void DFS(const int node)
{
    viz[node] = true;
    for (vector <int>::iterator it = G[node].begin(); it!=G[node].end(); ++it)
        if (!viz[*it])
            DFS(*it);
    p[++np] = node;
}

inline void DFST(const int node)
{
    if (ans[node] == true)
    {/// chiar daca exista sol mereu la problema asta
        existaSol = false;
        return ;
    }
    ans[neg(node)] = true;
    viz[node] = false;
    for (vector <int>::iterator it = GT[node].begin(); it!=GT[node].end(); ++it)
        if (viz[*it])
            DFST(*it);
}

void Solve()
{
    existaSol = true;
    int n2 = n + n;
    for (int i = 1; i<=n2; ++i)
        if (!viz[i])
            DFS(i);
    for (int i = n2; i; --i)
        if (viz[p[i]] && viz[neg(p[i])])
            DFST(p[i]);
}

void Write()
{
    ofstream g("andrei.out");
    int i;
    for (i=1; i<=n; ++i)
        g<<ans[i]<<" ";
    g<<"\n";
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}