Cod sursa(job #663666)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 18 ianuarie 2012 20:17:32
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<vector>
#define NMAx 200100
#define non(x) x<=n?x+n:x-n
using namespace std;
vector <int> G[NMAx],Gt[NMAx],comp[NMAx];
int n,nr,nrc,deque[NMAx],sol[NMAx];
bool viz[NMAx];

bool dfs(int nod) {
	int i;
	viz[nod]=0;
	if(sol[nod])
		return 0;
	sol[non(nod)]=1;
	comp[nrc].push_back(nod);
	for(i=0;i<Gt[nod].size();i++)
		if(viz[Gt[nod][i]])
			dfs(Gt[nod][i]);
}
void sort_top(int nod) {
	int i,vec;
	viz[nod]=1;
	for(i=0;i<G[nod].size();i++)
		if(!viz[G[nod][i]]) {
			vec=G[nod][i];
			sort_top(vec);
			}
	deque[nr--]=nod;
}
void citire() {
	int i,x,y,m;
	ifstream in("2sat.in");
	in>>n>>m;
	for(i=0;i<m;i++) {
		in>>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[x].push_back(non(y));
		Gt[y].push_back(non(x));
		}
	in.close();
}
void afis(int ans) {
	int i;
	ofstream out("2sat.out");
	if(ans)
		for(i=1;i<=n;i++)
			out<<sol[i]<<" ";
	else
		out<<"-1";
	out<<'\n';
}
int main() {
	int i,ans=1;
	citire();
	for(i=1,nr=2*n;i<=2*n;i++)
		if(!viz[i])
			sort_top(i);
	for(i=1;i<=2*n&&ans;i++)
		if(viz[deque[i]]&&viz[non(deque[i])]) {
			ans=dfs(deque[i]);
			nrc++;
			}
	afis(ans);
	return 0;
}