Cod sursa(job #1568143)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 13 ianuarie 2016 22:12:01
Problema 2SAT Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int nmax=100000,dnmax=200000;
vector<int> ve[dnmax+5],inv[dnmax+5],mco[dnmax+5];
bool be[dnmax+5],el[dnmax+5],tr[dnmax+5];
int co[dnmax+5],li[dnmax+5],in[dnmax+5],ou[dnmax+5],op[dnmax+5];
int lu,nc;
int neg(int x)
{
    if(x>nmax)
        return x-nmax;
    return x+nmax;
}
void dfs(int x)
{
    be[x]=1;
    for(int i=ve[x].size()-1;i>=0;i--)
        if(be[ve[x][i]]==0)
        dfs(ve[x][i]);
        lu++;
        li[lu]=x;
}
void baga(int x)
{
co[x]=nc;
for(int i=inv[x].size()-1;i>=0;i--)
{
    if(co[inv[x][i]]==0)
        baga(inv[x][i]);
}
}
void elim(int x)
{
for(int i=mco[x].size()-1;i>=0;i--)
    if(el[mco[x][i]]==0)
    elim(mco[x][i]);
    if(el[x]==0)
    {
        tr[x]=1;
        tr[op[x]]=0;
        el[x]=1;
        el[op[x]]=1;
    }
}
int main()
{
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    int n,m,i,j,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        if(x<0)
        x=x*(-1)+nmax;
        if(y<0)
            y=y*(-1)+nmax;
        ve[neg(x)].push_back(y);
        inv[y].push_back(neg(x));
        ve[neg(y)].push_back(x);
        inv[x].push_back(neg(y));
    }
    lu=nc=0;
    for(i=1;i<=dnmax;i++)
        if(be[i]==0)
            dfs(i);
    for(i=lu;i>=1;i--)
        if(co[li[i]]==0)
    {
        nc++;
        baga(li[i]);
    }
    for(i=1;i<=dnmax;i++)
        op[co[i]]=co[neg(i)];
    for(i=1;i<=dnmax;i++)
        for(j=ve[i].size()-1;j>=0;j--)
    {
        if(co[i]!=co[ve[i][j]])
        {
            mco[co[i]].push_back(co[ve[i][j]]);
            ou[co[i]]++;
            in[co[ve[i][j]]]++;
        }
    }
    for(i=1;i<=nc;i++)
        if(el[i]==0)
    {
        elim(i);
    }
    for(i=1;i<=n;i++)
        printf("%d ",tr[co[i]]);
    return 0;
}