Cod sursa(job #1911999)

Utilizator UrsuDanUrsu Dan UrsuDan Data 7 martie 2017 22:34:52
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

vector< vector< pair<int,int> > >g(100010);
vector<int> v1;
int v[100010];
bool ok;

void dfs(int node)
{
    int i;
    if(ok==false)
    {
        v[node]=0;
        return;
    }
    v1.push_back(node);
    for(i=0;i<g[node].size();i++)
    {
        if(v[node]==1 && v[g[node][i].first]==1 && g[node][i].second==0)
        {
            ok=0;
            return;
        }
        if(v[node]==2 && v[g[node][i].first]==2 && g[node][i].second==1)
        {
            ok=0;
            return;
        }
        if(v[node]==2 && v[g[node][i].first]==1 && g[node][i].second==2)
        {
            ok=0;
            return;
        }
        if(v[node]==1 && v[g[node][i].first]==2 && g[node][i].second==2)
        {
            ok=0;
            return;
        }
        if(v[g[node][i].first]==0)
        {
            if(g[node][i].second==0 && v[node]==1)
            {
                v[g[node][i].first]=2;
                dfs(g[node][i].first);
            }
            else if(g[node][i].second==1 && v[node]==2)
            {
                v[g[node][i].first]=1;
                dfs(g[node][i].first);
            }
            else if(g[node][i].second==2 && v[node]==2)
            {
                v[g[node][i].first]=1;
                dfs(g[node][i].first);
            }
            else if(g[node][i].second==2 && v[node]==1)
            {
                v[g[node][i].first]=1;
                dfs(g[node][i].first);
            }
        }
    }
}

int main()
{
    srand(time(0));
    freopen("andrei.in","r",stdin);
    freopen("andrei.out","w",stdout);
    int n,m,i,j,x,y,z;
    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));
    }
    for(i=1;i<=n;i++)
        if(v[i]==0)
        {
            if(rand()%2==0)
            {
                v[i]=1;
                ok=true;
                dfs(i);
                if(ok==false)
                {
                    x=v1.size()-1;
                    for(j=x;j>=0;j--)
                    {
                        v[v1[j]]=0;
                        v1.pop_back();
                    }
                    v[i]=2;
                    dfs(i);
                }
            }
            else
            {
                v[i]=2;
                ok=true;
                dfs(i);
                if(ok==false)
                {
                    x=v1.size()-1;
                    for(j=x;j>=0;j--)
                    {
                        v[v1[j]]=0;
                        v1.pop_back();
                    }
                    v[i]=1;
                    dfs(i);
                }
            }
            x=v1.size()-1;
            for(j=x;j>=0;j--)
                v1.pop_back();
        }
    for(i=1;i<=n;i++)
        printf("%d ",v[i]-1);
    return 0;
}