Cod sursa(job #2823044)
Utilizator | Data | 26 decembrie 2021 18:33:35 | |
---|---|---|---|
Problema | 2SAT | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 2.5 kb |
#include <fstream>
#include <vector>
//Solutie O(n*m)
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[200005];
int atrib[200005], q[200005];
int main()
{
int n,m,i,j,t=0,p=1,OK=1,x,y;
f>>n>>m;
for(i=1; i<= 2*n; i++)
atrib[i] = -1;
for(i=1; i<=m; i++)
{
f>>x>>y;
if(x>0)
x += n;
else
x = -1*x;
if(y>0)
y += n;
else
y = -1*y;
v[x].push_back(y);
v[y].push_back(x);
}
for(i=1; i<=n; i++)
if(atrib[i] == -1)
{
atrib[i] = 1;
atrib[i+n] = 0;
q[++t] = i;
while(p <= t)
{
int choose = q[p];
if(choose > n)
choose -= n;
else
choose +=n;
for(j=0; j<v[choose].size(); j++)
{
int constrain = v[choose][j];
if(atrib[constrain] == 0)
{
if(q[1] > n)
{
OK = 0;
t = 0;
break;
}
while(t>0)
{
atrib[q[t]] = -1;
if(q[t] > n)
atrib[q[t] - n] = -1;
else
atrib[q[t] + n] = -1;
t--;
}
atrib[i] = 0;
atrib[i+n] = 1;
p=0;
q[++t] = i+n;
break;
}
if(atrib[constrain] == -1)
{
atrib[constrain] = 1;
q[++t] = constrain;
if(constrain > n)
constrain -= n;
else
constrain +=n;
atrib[constrain] = 0;
}
}
p++;
}
t=0;
p=1;
if(OK == 0)
break;
}
if(OK == 1)
{
for(i=n+1; i<= 2*n; i++)
g<<atrib[i]<<' ';
}
else
g<<-1;
return 0;
}