Pagini recente » Rating Goje Samuel Andrei Daniel (pringon) | Arhiva de probleme | Algoritmiada 2009 - Clasament Runda 2, Studenti | Cod sursa (job #3206370) | Cod sursa (job #3283074)
#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;
}