Cod sursa(job #663634)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 18 ianuarie 2012 19:50:59
Problema 2SAT Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 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 solve() {
	int i,j;
	for(i=0;i<nrc/2;i++) {
		for(j=0;j<comp[i].size();j++)
			if(sol[comp[i][j]])
				return 0;
		for(j=0;j<comp[nrc-i-1].size();j++)
			sol[comp[nrc-i-1][j]]=1;
		}
	return 1;
}
void dfs(int nod) {
	int i;
	viz[nod]=0;
	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,n/=2;i<=n;i++)
			out<<sol[i]<<" ";
	else
		out<<"-1";
	out<<'\n';
}
int main() {
	int i,ans;
	citire();
	for(i=1,n*=2,nr=n;i<=n;i++)
		if(!viz[i])
			sort_top(i);
	for(i=1;i<=n;i++)
		if(viz[deque[i]]) {
			dfs(deque[i]);
			nrc++;
			}
	ans=solve();
	afis(ans);
	return 0;
}