Cod sursa(job #789148)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 17 septembrie 2012 12:53:38
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<vector>
using namespace std;
int n,m,sol[200100];
vector <int> G[200100],GT[200100];
int postordine[200100],nr;
bool viz[200100],solutie=true;

inline int Non(int x)
{
	if(x<=n)
		return x+n;
	return x-n;
}

inline void Citire()
{
	int i,x,y;
	ifstream fin("2sat.in");
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y;
		if(x<0)
			x=n+(-x);
		if(y<0)
			y=n+(-y);
		G[Non(x)].push_back(y);
		G[Non(y)].push_back(x);
		GT[y].push_back(Non(x));
		GT[x].push_back(Non(y));
	}
	fin.close();
}

inline void DFS(int x)
{
	viz[x]=true;
	vector <int>::iterator it;
	for(it=G[x].begin();it!=G[x].end();it++)
		if(!viz[*it])
			DFS(*it);
	postordine[++nr]=x;
}

inline void DFST(int x)
{
	if(sol[x]==1)
	{
		solutie=false;
		return;
	}
	viz[x]=false;
	sol[Non(x)]=1;
	vector <int>::iterator it;
	for(it=GT[x].begin();it!=GT[x].end();it++)
		if(viz[*it])
			DFST(*it);
}

inline void Rezolvare()
{
	int i;
	for(i=1;i<=2*n;i++)
		if(!viz[i])
			DFS(i);
	for(i=2*n;i>0;i--)
		if(viz[postordine[i]] && viz[Non(postordine[i])])
			DFST(postordine[i]);
}

inline void Afisare()
{
	int i;
	ofstream fout("2sat.out");
	if(!solutie)
		fout<<"-1\n";
	else
	{
		for(i=1;i<=n;i++)
			fout<<sol[i]<<' ';
		fout<<"\n";
	}
	fout.close();
}

int main()
{
	Citire();
	Rezolvare();
	Afisare();
	return 0;
}