Cod sursa(job #2723449)

Utilizator corina_dimitriuDimitriu Corina corina_dimitriu Data 14 martie 2021 06:24:09
Problema 2SAT Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <cmath>
#define DMAX 200005

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


bool Sat(int val[], int n, int m[][3])
{
    int i,x,y,z,adevar;
    for(i=0;i<n;i++)
       {
           x=abs(m[i][0]);
           x=val[x];
           if(m[i][0]<0)
              x=1-x;
           y=abs(m[i][1]);
           y=val[y];
           if(m[i][1]<0)
              y=1-y;
           adevar=(x||y);
           if(adevar==0)
              return 0;
       }
    return 1;
}

void Generate(int p, int val[], int maxi, int n, int m[][3], int& flag, int sol[])
{
   int j,i;
   if(p==maxi+1)
      {
       if(Sat(val,n,m)==1)
         {
            flag=1;
            for(j=1;j<=maxi;j++)
            sol[j]=val[j];
         }
       return;
      }
   if(flag==1)
      return;
   for(i=0;i<=1;i++)
   {
      val[p]=i;
      Generate(p+1,val,maxi,n,m,flag,sol);
   }
}

int val[DMAX],m[DMAX][3],sol[DMAX];

int main()
{
    int maxi=0,i,j,x,n,flag;
    fin>>n;
    maxi=n;
    fin>>n;
    for(i=0;i<n;i++)
        for(j=0;j<2;j++)
            fin>>m[i][j];

    flag=0;
    for(i=0;i<=1;i++)
    {
       val[1]=i;
       Generate(2,val,maxi,n,m,flag,sol);
    }
    if(flag==0)
    fout<<-1;
    else
       {
         for(i=1;i<=maxi;i++)
             fout<<sol[i]<<' ';
       }
    return 0;
}