Cod sursa(job #744378)

Utilizator darrenRares Buhai darren Data 8 mai 2012 16:02:14
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

const int SIZE = 100002;

int N, M;
vector<int> V1[2 * SIZE], V2[2 * SIZE];
bool S[2 * SIZE], result[2 * SIZE];
int st[2 * SIZE];

inline int rev(int x)
{
	return x + (x <= N ? 1 : -1) * N;
}
inline void add_edge(int nod1, int nod2)
{
	V1[rev(nod2)].push_back(nod1);
	V1[rev(nod1)].push_back(nod2);
	V2[nod1].push_back(rev(nod2));
	V2[nod2].push_back(rev(nod1));
}

void Dfs1(int x)
{
	S[x] = true;
	for (vector<int>::iterator it = V1[x].begin(); it != V1[x].end(); ++it)
		if (!S[*it])
			Dfs1(*it);
	st[++st[0]] = x;
}
void Dfs2(int x)
{
	S[x] = true;
	result[rev(x)] = true;
	for (vector<int>::iterator it = V2[x].begin(); it != V2[x].end(); ++it)
		if (!S[*it])
			Dfs2(*it);
}

int main()
{
	ifstream fin("andrei.in");
	ofstream fout("andrei.out");
	
	fin >> N >> M;
	for (int i = 1, nod1, nod2, value; i <= M; ++i)
	{
		fin >> nod1 >> nod2 >> value;
		
		if (value == 0)
			add_edge(nod1, nod2);
		if (value == 1)
			add_edge(rev(nod1), rev(nod2));
		if (value == 2)
		{
			add_edge(rev(nod1), nod2);
			add_edge(nod1, rev(nod2));
		}
	}
	
	for (int i = 1; i <= 2 * N; ++i)
		if (!S[i])
			Dfs1(i);
	
	memset(S, 0, sizeof(S));
	for (int i = 2 * N; i >= 1; --i)
		if (!result[st[i]] && !result[rev(st[i])])
			Dfs2(st[i]);
	
	for (int i = 1; i <= N; ++i)
		fout << !result[i] << ' ';
	fout << '\n';
	
	fin.close();
	fout.close();
}