Cod sursa(job #1542785)

Utilizator svlad2Scurtu Vlad svlad2 Data 5 decembrie 2015 17:30:41
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
int N,M,t;
int L[200005],C[200005],viz[200005],lista,sol[200005];
vector<int> a[200005],b[200005];
int complement(int x)
{
    if(x>N) return x-N;
    return x+N;
}
void dfs1(int nod)
{
    viz[nod]=1;
    int i;
    for(i=0;i<a[nod].size();i++)
    {
        if(!viz[a[nod][i]])
        {
            dfs1(a[nod][i]);
        }
    }
    L[lista--]=nod;
}
void dfs2(int nod,int t)
{
    C[nod]=t;
    int i;
    for(i=0;i<b[nod].size();i++)
    {
        if(!C[b[nod][i]])
        {
            dfs2(b[nod][i],t);
        }
    }
}
int main()
{
    f>>N>>M;
    int i,x,y,c1,c2;
    t=1;
    lista=N*2;
    for(i=1;i<=M;i++)
    {
        f>>x>>y;
        if(x<0) x=x*(-1)+N;
        if(y<0) y=y*(-1)+N;
        c1=complement(x);
        c2=complement(y);
        a[c1].push_back(y);
        a[c2].push_back(x);
        b[y].push_back(c1);
        b[x].push_back(c2);
    }
    for(i=1;i<=N*2;i++)
    {
        if(!viz[i])
        {
            dfs1(i);
        }
    }
    t=1;
    for(i=1;i<=N*2;i++)
    {
        if(!C[L[i]]) dfs2(L[i],t),t++;
    }
    for(i=1;i<=N;i++)
    {
        if(C[i]==C[i+N])
        {
            g<<-1;
            return 0;
        }
    }
    int cnt,j;
    for(i=1;i<t;i++)
    {   cnt=-1;
        for(j=1;j<=2*N;j++)
        {
            if(C[j]==i&&sol[j]!=0) cnt=sol[j];
        }
        if(cnt!=-1)
        {
            for(j=1;j<=2*N;j++)
            {   if(C[j]==i)
                {   sol[j]=cnt;
                    if(cnt==1) c1=2;
                    else c2=1;
                    if(j<=N) if(sol[j+N]==0) sol[j+N]=c1;
                    else if(sol[j-N]==0) sol[j-N]=c2;
                }
            }
        }
        else
        {
            for(j=1;j<=2*N;j++)
            {   if(C[j]==i)
                {sol[j]=1;
                if(j<=N) if(sol[j+N]==0) sol[j+N]=2;
                else if(sol[j-N]==0) sol[j-N]=2;
                }
            }
        }
    }
    for(i=1;i<=N;i++) g<<sol[i]-1<<" ";
    return 0;
}