Cod sursa(job #2608070)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 30 aprilie 2020 15:40:11
Problema Andrei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("andrei.in");
ofstream cout("andrei.out");

const int NMAX = 2e5;

int N, M;
vector <int> g[NMAX + 5];
vector <int> t[NMAX + 5];

int kComp, seen[NMAX + 5];
int top, stk[NMAX + 5];
void dfs1(int node)
{
	seen[node] = true;

	for(auto it : g[node])
		if(!seen[it]) dfs1(it);

	stk[++top] = node;
}

void dfs2(int node)
{
	seen[node] = kComp;

	for(auto it : t[node])
		if(seen[it] == 0) dfs2(it);
}

int Nrm(int x){return x;}
int Not(int x){return x + N;}

int main()
{
	cin >> N >> M;

	for(int i = 1; i <= M; i++)
		{
			int x, y, z;
			cin >> x >> y >> z;

			if(z == 1)
				{
					g[Not(x)].push_back(Nrm(y));
					g[Not(y)].push_back(Nrm(x));

					t[Nrm(y)].push_back(Not(x));
					t[Nrm(x)].push_back(Not(y));
				}
			else if(z == 0)
				{
					g[Nrm(x)].push_back(Not(y));
					g[Nrm(y)].push_back(Not(x));

					t[Not(y)].push_back(Nrm(x));
					t[Not(x)].push_back(Nrm(y));
				}	
			else
				{
					g[Nrm(x)].push_back(Nrm(y));
					g[Not(x)].push_back(Not(y));

					t[Nrm(y)].push_back(Nrm(x));
					t[Not(y)].push_back(Not(x));

					g[Nrm(y)].push_back(Nrm(x));
					g[Not(y)].push_back(Not(x));

					t[Nrm(x)].push_back(Nrm(y));
					t[Not(x)].push_back(Not(y));
				}
		}

	for(int i = 1; i <= 2 * N; i++)
		if(!seen[i]) dfs1(i);

	for(int i = 1; i <= 2 * N; i++) seen[i] = 0;

	while(top > 0)
	{
		int node = stk[top]; top--;

		if(seen[node] == 0)
		{
			++kComp;
			dfs2(node);
		}
	}

	for(int i = 1; i <= N; i++)
		cout << (seen[i + N] > seen[i]) << ' ';

	return 0;
}