Pagini recente » Arhiva de probleme | infoarena - comunitate informatica, concursuri de programare | ra0ul | Cod sursa (job #8944) | Cod sursa (job #1147914)
#include <fstream>
#include <list>
#define fori(l) for(list<int>::iterator it=l.begin();it!=l.end();++it)
using namespace std;
int n,m,st[200100],sti;
list<int> g[200100],t[200100];
bool v[200100],b[200100],nvalid;
inline int nd(int a)
{
if(a>0)
return a;
return n-a;
}
inline int non(int a)
{
if(a<=n)
return a+n;
return a-n;
}
void dfsg(int nod)
{
v[nod]=1;
fori(g[nod])
if(!v[*it])
dfsg(*it);
st[sti++]=nod;
}
void dfst(int nod)
{
v[nod]=0;
if(b[nod])
nvalid=1;
b[non(nod)]=1;
fori(t[nod])
if(v[*it])
dfst(*it);
}
ifstream fin("2sat.in");
ofstream fout("2sat.out");
int main()
{
int i,j;
fin>>n>>m;
while(m--)
{
fin>>i>>j;
i=nd(i);
j=nd(j);
g[non(i)].push_back(j);
g[non(j)].push_back(i);
t[j].push_back(non(i));
t[i].push_back(non(j));
}
for(i=1;i<=n<<1;++i)
if(!v[i])
dfsg(i);
while(sti--)
if(v[st[sti]]&&v[non(st[sti])])
dfst(st[sti]);
if(nvalid)
fout<<"-1";
else
for(i=1;i<=n;++i)
fout<<b[i]<<" ";
fout<<"\n";
return 0;
}