Pagini recente » Cod sursa (job #2259564) | Cod sursa (job #865693) | Cod sursa (job #423330) | Cod sursa (job #253624) | Cod sursa (job #1708804)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
const int nmax= 100000;
const int nmax2= 200000;
bool u[nmax2+1], sol[nmax2+1];
int r[nmax2+1];
vector <int> gi[nmax2+1], go[nmax2+1], v[nmax2+1], l1, l2;
void dfs( int x ) {
if ( u[x]==0 ) {
u[x]= 1;
for ( vector <int>::iterator it= go[x].begin(); it!=go[x].end(); ++it ) {
dfs(*it);
}
l1.push_back(x);
}
}
void assign( int x, int root ) {
if ( r[x]==0 ) {
r[x]= root;
v[root].push_back(x);
for ( vector <int>::iterator it= gi[x].begin(); it!=gi[x].end(); ++it ) {
assign(*it, root);
}
}
}
void make_edge( int x, int y ) {
go[x].push_back(y);
gi[y].push_back(x);
}
int main( ) {
int n, m;
fin>>n>>m;
for ( int cnt= 1, x, y, x2, y2; cnt<=m; ++cnt ) {
fin>>x>>y;
x2= x+n, y2= y+n;
if ( x<0 ) {
x2= -x, x= n-x;
}
if ( y<0 ) {
y2= -y, y= n-y;
}
make_edge(x2, y), make_edge(y2, x);
}
for ( int i= 1; i<=n*2; ++i ) {
dfs(i);
}
for ( vector <int>::reverse_iterator it= l1.rbegin(); it!=l1.rend(); ++it ) {
if ( r[*it]==0 ) {
l2.push_back(*it);
}
assign(*it, *it);
}
for ( int i= 1; i<=n; ++i ) {
if ( r[i]==r[i+n] && r[i]!=0 ) {
fout<<"-1\n";
return 0;
}
}
for ( int i= 0, j= (int)l2.size()-1; i<j; ++i, --j ) {
for ( vector <int>::iterator it= v[l2[i]].begin(); it!=v[l2[i]].end(); ++it ) {
sol[*it]= 0;
}
for ( vector <int>::iterator it= v[l2[j]].begin(); it!=v[l2[j]].end(); ++it ) {
sol[*it]= 1;
}
}
for ( int i= 1; i<=n; ++i ) {
fout<<sol[i]<<" ";
}
fout<<"\n";
return 0;
}