Cod sursa(job #3283074)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 8 martie 2025 09:37:31
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
#include<deque>
#include<vector>
using namespace std;

ifstream cin("2sat.in");
ofstream cout("2sat.out");

deque<int> s;
vector<int> v[200002],v1[200002],a;

int rasp[200002],n;

int calc(int i){
	return (i+n)%(2*n);
}
void dfs(int poz,int val){
	if(rasp[poz]==val) return;
	rasp[poz]=val;
	if(!val) a.push_back(poz);
	if(val) for(auto it: v[poz]) dfs(it,val);
	else for(auto it: v1[poz]) dfs(it,val);
	if(val) s.push_back(poz);
}
int main()
{
	int m,i,j,a1,b;
	cin>>n>>m;
    for(i=1;i<=m;i++){
		cin>>a1>>b;
		a1=abs(a1)+(a1>0)*n-1;
		b=abs(b)+(b>0)*n-1;
		v[calc(a1)].push_back(b);
		v[calc(b)].push_back(a1);
		v1[a1].push_back(calc(b));
		v1[b].push_back(calc(a1));
	}
	for(i=0;i<2*n;i++) dfs(i,1);
	while(!s.empty()){///printf("%d\n",s.back());
		dfs(s.back(),0);
		s.pop_back();
    }
	for(auto it:a){
		if(!rasp[it]){
            rasp[it]=1;rasp[calc(it)]=2;
		}
	}
	for(i=0;i<2*n;i++){
		if(rasp[i]==2){
			for(auto it:v[i]){
				if(rasp[it]==1){
					cout<<"-1";
					return 0;
				}
			}
		}
	}
	for(i=n;i<2*n;i++)
		cout<<rasp[i]-1<<" ";
	return 0;
}