Cod sursa(job #1937386)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 23 martie 2017 22:12:05
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define nmax 200005
using namespace std;
class instream
{
public:
    instream() {}
    instream(const char *file_name) {
        input_file=fopen(file_name,"r");
        cursor=0;
        fread(buffer,sizy,1,input_file);
    }
    inline instream &operator >>(int &n) {
        while((buffer[cursor]<'0'||buffer[cursor]>'9')&&(buffer[cursor]!='-'))
            advance();
        int semn=1;
        if (buffer[cursor]=='-')
            semn=-semn,advance();
        n=0;
        while('0'<=buffer[cursor]&&buffer[cursor]<='9')
        {
            n=n*10+buffer[cursor]-'0';
            advance();
        }
        n*=semn;
        return *this;
    }
private:
    FILE *input_file;
    static const int sizy=1<<16;
    int cursor;
    char buffer[sizy];
    inline void advance() {
        ++ cursor;
        if(cursor==sizy){
            cursor=0;
            fread(buffer,sizy,1,input_file);
        }
    }
};
instream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[nmax],p[nmax];
bitset <nmax> b;
stack <int> s;
int n,m,sol[nmax];

int cod(int x)
{
    if (x<0)
        return n-x;
    return x;
}
int opus(int x)
{
    if (x<=n)
        return x+n;
    return x-n;
}
void dfs(int x)
{
    int i,y;
    b[x]=1;
    for (i=0;i<v[x].size();i++) {
        y=v[x][i];
        if (b[y]==0)
            dfs(y);
    }
    s.push(x);
}
void dft(int x)
{
    if (sol[x]) {
        sol[0]=-1;
        return ;
    }
    int i,y;
    sol[opus(x)]=1;
    b[x]=0;
    for (i=0;i<p[x].size();i++) {
        y=p[x][i];
        if (b[y]==1)
            dft(y);
    }
}
void implic(int x,int y)
{
    v[cod(x)].push_back(cod(y));
    p[cod(y)].push_back(cod(x));
}
int main()
{
    int i,j,x,y;
    f>>n>>m;
    for (i=1;i<=m;i++) {
        f>>x>>y;
        implic(-x,y);
        implic(-y,x);
    }
    for (i=1;i<=2*n;i++)
        if (b[i]==0)
            dfs(i);

    while (!s.empty()) {
        i=s.top();
        s.pop();
        if (b[i]==1&&b[opus(i)]==1)
            dft(i);
    }
    if (sol[0]==-1) {
        g<<-1<<'\n';
        return 0;
    }
    for (i=1;i<=n;i++)
        g<<sol[i]<<' ';

    return 0;
}