Cod sursa(job #1147914)

Utilizator vladrochianVlad Rochian vladrochian Data 20 martie 2014 11:27:08
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#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;
}