Cod sursa(job #1299536)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 23 decembrie 2014 18:32:41
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#include <vector>
#define nmax 10005
#define pb push_back
#define mp make_pair

using namespace std;

vector<pair<int, int> >a[nmax];
bool used[nmax];
int n, m, x, y, z, i;
short sol[nmax];

inline bool df(int node, int qq)
{
    vector<pair<int, int> >::iterator it;

    if(used[node])
    {
        if(sol[node]!=qq) return 0;
        return 1;
    }
    used[node]=true;
    sol[node]=qq;
    for(it=a[node].begin(); it!=a[node].end(); ++it)
    {
        if(it->second==0 && qq==0) //cazul I, in care node si vecinul sau nu pot sa fie in A
        {
            if(!df(it->first, 1)) return 0;
            //returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
        }
        if(it->second==1 && qq==1) //cazul II, in care node si vecinul sau nu pot sa fie in B
        {
            if(!df(it->first, 0)) return 0;
            //returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
        }
        if(it->second==2) //daca muchia e violet node si vecinul sau se afla in aceeasi multime qq
        {
            if(!df(it->first, qq)) return 0;
            //returneaza 0 daca node si vecinul sau nu pot fi asezati astfel in A si B
        }
    }
    return 1; //daca toate conditiile sunt indeplinite returneaza 1
}
int main ()
{
    freopen("andrei.in", "rt", stdin);
    freopen("andrei.out", "wt", stdout);

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

    for(i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &x, &y, &z);
        a[x].pb(mp(y, z));
        a[y].pb(mp(x, z));
    }

    for(i=1; i<=n; ++i)
    if(!used[i])
    {
        if(!df(i, 0)) df(i, 1); //verific in ce multime se potriveste fiecare nod si actualizez si pozitia vecinilor in multimi
    }

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

    return 0;
}