Cod sursa(job #1511668)

Utilizator vasica38Vasile Catana vasica38 Data 26 octombrie 2015 23:54:20
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<bits/stdc++.h>

using namespace std;

typedef struct lista
{
    int info;
    lista * next;
} *nod;


nod a[200123];
nod b[200123];
int ctc[200123];
bool viz[200123];
int st[200123];
int u,i,k,m,n;

void add(int x, nod &p)
{
    nod r=new lista;
    r->info=x;
    r->next=p;
    p=r;
}


int negat(int x)
{
    return ((x<=n) ? (x+n) : (x-n));
}


void dfs1(int x)
{
    viz[x]=1;
    nod r=a[x];
    while (r)
    {
        if (!viz[r->info] ) dfs1(r->info);
        r=r->next;
    }
    st[++u]=x;

}


void dfs2(int x, int k)
{
    ctc[x]=k;
    nod r=b[x];
    viz[x]=0;
    while (r)
    {
        if (viz[r->info]) dfs2(r->info,k);
        r=r->next;
    }
}


int main()
{
    ifstream cin("2sat.in");
    ofstream cout("2sat.out");
    cin>>n>>m;
    while (m--)
    {
        int x,y;
        cin>>x>>y;
        if (x<0) x=-x+n;
        if (y<0) y=-y+n;
        add(y,a[negat(x)]);
        add(x,a[negat(y)]);
        add(negat(x),b[y]);
        add(negat(y),b[x]);
    }
    for (i=1; i<=2*n; ++i)
        if (!viz[i]) dfs1(i);
    int nr=0;
    for (i=u; i>=1; --i)
        if (viz[st[i]]) {++nr; dfs2(st[i],nr);};
    for (i=1; i<=n; ++i) cout<<((ctc[i]>ctc[i+n]))<<" ";


    return 0;
 }