Cod sursa(job #2692454)

Utilizator armigheGheorghe Liviu Armand armighe Data 2 ianuarie 2021 18:46:51
Problema Andrei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
vector<int>a[200002],inv[200002];
int n,k,kk[200002],ctc[200002];
bool viz[200002];

int val(int x)
{
    if(x<0)
        return -x+n;
    return x;
}

int neg(int x)
{
    if(x>n)
        return x-n;
    return x+n;
}

void dfs(int x)
{
    viz[x]=1;
    for(auto y:a[x])
    if(viz[y]==0)
        dfs(y);
    kk[++k]=x;
}

void dfs_inv(int x)
{
    viz[x]=1;
    ctc[x]=k;
    for(auto y:inv[x])
    if(viz[y]==0)
        dfs_inv(y);
}

void kosaraju()
{
    int i;
    for(i=1;i<=2*n;i++)
    if(viz[i]==0)
        dfs(i);
    for(i=1;i<=2*n;i++)
        viz[i]=0;
    k=0;
    for(i=2*n;i>=1;i--)
    if(viz[kk[i]]==0)
    {
        k++;
        dfs_inv(kk[i]);
    }
}

int main()
{
    int m,i,x,y,c;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        if(c==0)
        {
            a[neg(x)].push_back(y);
            a[neg(y)].push_back(x);
            inv[y].push_back(neg(x));
            inv[x].push_back(neg(y));
        }
        else
        if(c==1)
        {
            a[x].push_back(neg(y));
            a[y].push_back(neg(x));
            inv[neg(y)].push_back(x);
            inv[neg(x)].push_back(y);
        }
        else
        {
            a[x].push_back(y);
            a[y].push_back(x);
            a[neg(x)].push_back(neg(y));
            a[neg(y)].push_back(neg(x));
            inv[x].push_back(y);
            inv[y].push_back(x);
            inv[neg(x)].push_back(neg(y));
            inv[neg(y)].push_back(neg(x));
        }
    }
    kosaraju();
    for(i=1;i<=n;i++)
    if(ctc[i]==ctc[i+n])
    {
        g<<-1;
        return 0;
    }
    for(i=1;i<=n;i++)
    if(ctc[i]<ctc[i+n])
        g<<0<<" ";
    else
        g<<1<<" ";
    return 0;
}