Cod sursa(job #1929358)

Utilizator LucianTLucian Trepteanu LucianT Data 17 martie 2017 15:44:11
Problema Andrei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>
#define maxN 2*100005
using namespace std;
vector<int> v[maxN];
int scc[maxN],val[maxN];
int n,m,i,j,x,y;
int idx[maxN],low[maxN],curr;
int stk[maxN],top;
bool in_stk[maxN];
inline int opposite(int x)
{
    if(x>n)
        return x-n;
    return x+n;
}
void tarjan(int nod)
{
    idx[nod]=low[nod]=++curr;

    stk[++top]=nod;
    in_stk[nod]=true;

    for(auto it:v[nod])
        if(!idx[it]){
            tarjan(it);
            low[nod]=min(low[nod],low[it]);
        }
        else if(in_stk[it])
            low[nod]=min(low[nod],idx[it]);

    if(low[nod]==idx[nod])
    {
        int newn;
        do{
            newn=stk[top--];
            in_stk[newn]=false;
            if(!val[newn]){ /* assign values */
                val[newn]=1;
                val[opposite(newn)]=-1;
            }
        }while(newn!=nod);
    }
}
void addEdge(int x,int y)
{
    v[opposite(x)].push_back(y);
    v[opposite(y)].push_back(x);
}
int main()
{
    freopen("andrei.in","r",stdin);
    freopen("andrei.out","w",stdout);
    scanf("%d %d",&n,&m);
    for(i=1;i<=m;i++) /* building 2-SAT graph */
    {
        int col;
        scanf("%d %d %d",&x,&y,&col);
        if(col==0){
            addEdge(x,y);
        }
        else if(col==1){
            addEdge(opposite(x),opposite(y));
        }
        else{
            addEdge(opposite(x),y);
            addEdge(x,opposite(y));
        }
    }
    for(i=1;i<=2*n;i++)
        if(!idx[i])
            tarjan(i);
    for(i=1;i<=n;i++)
        printf("%d ",(val[i]==1?1:0));
    return 0;
}