Cod sursa(job #1576471)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 22 ianuarie 2016 15:00:43
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.08 kb
#include <iostream>//Foloseste Kosaraju
#include <fstream>//De ce unele teste pe care iau Gresit afiseaza doar 1 atunci cand eu gasesc o solutie?
#include <vector>
#include <stack>
#include <string.h>
#define NMAX 100005
using namespace std;
vector<int> Comp[NMAX*2+1],L,G[NMAX*2+1],Gt[NMAX*2+1];
vector< vector<int> > componentVector;
bool visited[NMAX*2],val[NMAX],solved,mark[NMAX*2];
int NrComp,N,M,component[NMAX*2];
#define G (G+NMAX)
#define Gt (Gt+NMAX)


#define component (component+NMAX)
#define visited (visited+NMAX)
void push(int x, int y)
{
    G[x].push_back(y);
    Gt[y].push_back(x);
}

void read()
{
    scanf("%d%d", &N, &M);
    int a,b,conva,convb,notconva,notconvb;

    for(int i=1; i<=M; i++) // G: -N, ..., -4, -3, -2, -1, 1, 2, 3, 4, ..., N
    {
        scanf("%d%d", &a, &b);
        push(-a,b);
        push(-b,a);
    }
}
void visit(int u)
{
    if(visited[u])
        return;

    visited[u]=1;
    for(int i=0; i<G[u].size(); ++i)
    //for(int i=1; i<=G[u][0]; ++i)
        visit(G[u][i]);
    L.push_back(u);
}
void createComponent(int u,int componenta)
{
    component[u]=componenta;
    componentVector[componenta].push_back(u);
    for(int i=0; i<Gt[u].size(); ++i)
    {
        int nod=Gt[u][i];
        if(!component[nod])
            createComponent(nod,componenta);
    }
}

void afisare()
{
    for(int i=N+1;i<=N*2;i++)
        cout<<val[i]<<' ';
    cout<<'\n';
}

void setVal (bool value, int x) {
    if (x>0)
        val[x] = value;
    else
        val[-x] = !value;
}

bool sat2()
{
    short *compVal=new short[componentVector.size()];
    memset(compVal,0,componentVector.size()*2);

    for (int i = componentVector.size()-1; i>=1; i--)
    {
        if(compVal[i]==0){
            compVal[i]=2;
            for(int j=0;j<componentVector[i].size(); j++)
            {
                if(component[componentVector[i][j]]==component[-componentVector[i][j]])
                    return 0;
                setVal (1, componentVector[i][j]);
            }

            int ni = component[-componentVector[i][0]];
            compVal[ni]=1;
        }
    }

    return 1;
}

int main()
{
    freopen("2sat.in","rt",stdin);
    freopen("2sat.out","wt",stdout);
    read();
    //sortare topologica Kosaraju
    for(int u=1; u<=N; u++)
        visit(u),
        visit(-u);

    /*for(int i=0;i<L.size();i++)
        cout<<L[i]<<' ';
    cout<<'\n';*/
    //crearea componentelor conexe
    componentVector.push_back(*new vector<int>);
    while(!L.empty())
    {
        if(!component[L.back ()]) {
            componentVector.push_back(*new vector<int>);
            createComponent(L.back(),componentVector.size()-1);
        }
        L.pop_back();
    }
    /*for(int i=1;i<componentVector.size();i++)
    {
        for(int j=0;j<componentVector[i].size();j++)
            cout<<componentVector[i][j]<<' ';
        cout<<'\n';
    }*/
    if(sat2()){
        for(int i=1;i<=N;i++)
            cout<<val[i]<<' ';
        cout<<'\n';
    }else
        cout<<"-1\n";

}