Cod sursa(job #467286)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 28 iunie 2010 13:48:38
Problema Andrei Scor 5
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.68 kb
#include <cstdio>
#include <vector>
using namespace std;
#define nmax 100010
#define f first
#define s second

int n, m;
vector <pair<int, int> > g[nmax];
int r[nmax];

int cmp (pair <int, int> a, pair<int, int> b)
{
    return a.s>b.s;
}

int dfs(int nod)
{
    int i, c;
    for (i=0; i<g[nod].size(); i++)
    {
        if (r[g[nod][i].f]!=-1)
        {
            if (g[nod][i].s==2 && r[nod]!=r[g[nod][i].f]) return 0; else
            if (g[nod][i].s==0 && r[nod]==0 && r[g[nod][i].f]==0) return 0; else
            if (g[nod][i].s==1 && r[nod]==1 && r[g[nod][i].f]==1) return 0;
        } else
        {
            if (g[nod][i].s==0)
            {
                if (r[nod]==0)
                {
                    r[g[nod][i].f]=1;
                    c=dfs(g[nod][i].f);
                    if (!c) r[g[nod][i].f]=-1;
                } else
                {
                    r[g[nod][i].f]=1;
                    c=dfs(g[nod][i].f);
                    if (!c)
                    {
                        r[g[nod][i].f]=0;
                        c=dfs(g[nod][i].f);
                        if (!c) r[g[nod][i].f]=-1;
                    }
                }
            } else
            if (g[nod][i].s==1)
            {
                if (r[nod]==1)
                {
                    r[g[nod][i].f]=0;
                    c=dfs(g[nod][i].f);
                    if (!c) r[g[nod][i].f]=-1;
                } else
                {
                    r[g[nod][i].f]=0;
                    c=dfs(g[nod][i].f);

                    if (!c)
                    {
                        r[g[nod][i].f]=1;
                        c=dfs(g[nod][i].f);
                        if (!c) r[g[nod][i].f]=-1;
                    }
                }
            } else
            if (g[nod][i].s==2)
            {
                r[g[nod][i].f]=r[nod];
                c=dfs(g[nod][i].f);
                if (!c) r[g[nod][i].f]=-1;
            }
            return c;
        }
    }
    return 1;
}

int main()
{
    freopen("andrei.in","r",stdin);
    freopen("andrei.out","w",stdout);
    scanf("%d %d",&n,&m);
    int x, y, c, i, j;
    while (m--)
    {
        scanf("%d %d %d",&x,&y,&c);
        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }
    for (i=1; i<=n; i++) r[i]=-1;
    for (i=1; i<=n; i++)
        if (r[i]==-1)
        {
            r[i]=0;
            c=dfs(i);
            if (!c)
            {
                r[i]=1;
                c=dfs(i);
            }
        }
    for (i=1; i<=n; i++)
        if (r[i]==-1) r[i]=0;
    for (i=1; i<=n; i++) printf("%d ",r[i]);
}