Cod sursa(job #1542391)

Utilizator evillyonLeon Daniel evillyon Data 5 decembrie 2015 12:41:24
Problema 2SAT Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");

int a[200000][1000],n,m;
int b[200000][1000];
int v[100000];
struct
{
    int x[100000];
    int k;
}l;

void dfs(int i,int t,int a[][1000])
{
    //cout << "start " << i << endl;
    int j;
    v[i]=t;
    for(j=1;j<=a[i][0];j++)
        if(!v[a[i][j]])
            dfs(a[i][j],t,a);
    if(t==1)
        l.x[l.k++]=i;
    //cout << "end " << i << endl;
}

void draw_arc(int x,int y,int a[][1000])
{
    if(x<0)x=x*-1+n;
    if(y<0)y=y*-1+n;
    a[x][0]++;
    a[x][a[x][0]]=y;
}
int main()
{
    fin>>n>>m;
    int j,i;
    while(m--)
    {
        fin>>i>>j;
        draw_arc(i*-1,j,a);
        draw_arc(j*-1,i,a);
    }
    for(j=1;j<=n*2;j++)
        if(!v[j])
        dfs(j,1,a);
    for(i=1;i<=n*2;i++)
        for(j=1;j<=a[i][0];j++)
            draw_arc(a[i][j],i,b);
    for(i=0;i<=n*2;i++)v[i]=0;
    int t=2;
    for(j=l.k-1;j>=0;j--)
        if(!v[l.x[j]])
        {
            dfs(l.x[j],t,b);
            t++;
        }
    for(i=1;i<=n*2;i++)
        for(j=1;j<=n*2;j++)
            if(i==j)continue;
            else if(v[l.x[j]]==v[l.x[i]] && (i==j-n || j==i-n))
            {
                fout<<-1;
                return 0;
            }
    for(i=1;i<=n;i++)
        if(v[i]<=t/2)
            fout<<0<<" ";
        else fout<<1<<" ";
    return 0;
}