Cod sursa(job #1300466)

Utilizator OctaDuiu Octavian Octa Data 24 decembrie 2014 14:45:09
Problema Andrei Scor 100
Compilator cpp Status done
Runda tema_vacanta_iarna Marime 1.28 kb
#include<cstdio>
#include<vector>
using namespace std;

vector < pair<int, int> > g[100003];
vector < int > visited;
int n,m,i,x,y,z,v[100003];
bool u[100003];

bool dfs(int nod, int p)
{
    vector< pair <int, int> >::iterator it;

    if(u[nod])
    {
        if(v[nod]!=p) return 0;

      return 1;
    }

    visited.push_back(nod); u[nod]=true; v[nod]=p;

    for(it=g[nod].begin();it!=g[nod].end();++it)
    {
        if(it->second==0 && p==0)
            if(!dfs(it->first, 1))  return 0;

        if(it->second==1 && p==1)
            if(!dfs(it->first, 0))  return 0;

        if(it->second==2)
            if(!dfs(it->first, p)) return 0;
    }

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

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

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

    vector<int>::iterator it;

    for(i=1;i<=n;++i)
        if(!u[i])
        {
            if(!dfs(i,0))
            {
                for(it=visited.begin();it!=visited.end();++it) u[*it]=false;
                dfs(i,1);
            }
        }

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

 return 0;
}