Cod sursa(job #1119855)

Utilizator pulseOvidiu Giorgi pulse Data 24 februarie 2014 20:22:58
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin ("andrei.in");
ofstream fout ("andrei.out");

#define NMAX 200005

int n, m;
int p[NMAX], np;
vector <int> G[NMAX];
vector <int> Gt[NMAX];
bool used[NMAX], sol[NMAX];
bool isSol;

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

inline void Add (int x, int y)
{
	G[Neg(x)].push_back (y);
	G[Neg(y)].push_back (x);

	Gt[y].push_back (Neg(x));
	Gt[x].push_back (Neg(y));
}

void Read_Data ()
{
	fin >> n >> m;
	for (int i = 1, a, b, c; i <= n; ++i)
	{
		fin >> a >> b >> c;
		switch (c)
		{
			case 0: { Add (a, b); break; }
			case 1: { Add (Neg(a), Neg(b)); break; }
			case 2 : { Add (Neg(a), b); Add (a, Neg(b)); break; }
		}
	}
}

inline void DFS (int node)
{
	used[node] = true;
	for (vector <int> :: iterator it = G[node].begin (); it != G[node].end (); ++it)
		if (!used[*it])
			DFS (*it);
	p[++np] = node;
}

inline void DFS_T (int node)
{
	if (sol[node] == true) { isSol = false; return; }
	sol[Neg(node)] = true;
	used[node] = false;
	for (vector <int> :: iterator it = Gt[node].begin (); it != Gt[node].end (); ++it)
		if (used[*it])
			DFS_T (*it);
}

void Solve ()
{
	int N = n + n;
	isSol = true;
	for (int i = 1; i <= N; ++i)
		if (!used[i])
			DFS (i);
	for (int i = N; i; --i)
		if (used[p[i]] and used[Neg(p[i])])
			DFS_T (p[i]);
}

inline void Write_Data ()
{
	for (int i = 1; i <= n; ++i)
		fout << sol[i] << " ";
	fout << "\n";
}

int main ()
{
	Read_Data ();
	Solve ();
	Write_Data ();
	fin.close (); fout.close ();
	return 0;
}