Cod sursa(job #1966678)

Utilizator lflorin29Florin Laiu lflorin29 Data 15 aprilie 2017 14:44:57
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2 * 1e5 + 9;

int n, m, comp_id, komp[MAX_N];
bool viz[MAX_N];
vector<int>g[MAX_N], gt[MAX_N];
vector<int>ord;

int non(int x)
{
	return x ^ 1;
}

int get(int x)
{
	return x < 0 ? -2 * x : 2 * x + 1;
}

void Read()
{
	scanf("%d%d", &n, &m);

	for (int i = 1; i <= m; ++i)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		a = get (a), b = get (b);
		g[non(a)].push_back(b);
		g[non(b)].push_back(a);
		gt[b].push_back(non(a));
		gt[a].push_back(non(b));
	}
}

void Dfs1(int nod)
{
	viz[nod] = 1;

	for (auto i : g[nod])
		if (!viz[i])Dfs1(i);

	ord.push_back(nod);
}

void Dfs2(int nod)
{
	komp[nod] = comp_id;
	viz[nod] = 1;

	for (auto i : gt[nod])
		if (!viz[i])Dfs2(i);
}

void TareKonexe()
{
	for (int i = 2; i <= 2 * n + 1; ++i)
		if (!viz[i])Dfs1(i);

	memset(viz, 0, sizeof viz);

	while (!ord.empty())
	{
		int nod = ord.back();
		ord.pop_back();

		if (!viz[nod])
		{
			++comp_id;
			Dfs2(nod);
		}
	}
}

void Solve()
{
	for (int i = 2; i <= 2 * n + 1; i+=2)
		if (komp[i] == komp[i ^ 1])
		{
			printf("%d", -1);
			return;
		}

	for (int i = 1; i <= n; ++i)
		if (komp[2 * i] <komp[2 * i + 1])printf("%d ", 1);
		else printf("%d ", 0);
}

int main()
{
	freopen("2sat.in", "r", stdin);
	freopen("2sat.out", "w", stdout);
	Read();
	TareKonexe();
	Solve();
}