Pagini recente » Cod sursa (job #2623640) | Cod sursa (job #2003248)
#include <bits/stdc++.h>
#define Nmax 200010
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
list <int> G[Nmax];
list <int> Gt[Nmax];
int ord[Nmax];
int n,N;
bool ok=true;
bitset <Nmax> viz;
bool sol[Nmax];
int non(const int &x)
{
if(x<=n) return x+n;
else return x-n;
}
inline void add_edge(const int &x,const int &y)
{
G[x].push_back(y);
Gt[y].push_back(x);
}
void DFS(const int &x)
{
list <int> :: iterator it;
viz[x]=true;
for(it=G[x].begin();it!=G[x].end();it++)
if(!viz[*it]) DFS(*it);
ord[++N]=x;
}
void DFFS(const int &x)
{
list <int> :: iterator it;
if(sol[x]) ok=false;
viz[x]=sol[x]=false;
sol[non(x)]=1;
for(it=Gt[x].begin();it!=Gt[x].end();it++)
if(viz[*it]) DFFS(*it);
}
int main()
{
int m,i,j,k;
f>>n>>m;
for(k=1;k<=m;k++)
{
f>>i>>j;
if(i<0) i=n-i;
if(j<0) j=n-j;
add_edge(non(i),j);
add_edge(non(j),i);
}
for(i=1;i<=2*n;i++)
if(!viz[i])
DFS(i);
for(i=N;i;i--)
if(viz[ord[i]] and viz[non(ord[i])])
DFFS(ord[i]);
if(!ok)
{
g<<-1;
return 0;
}
for(i=1;i<=n;i++)
g<<sol[i]<<' ';
return 0;
}