Cod sursa(job #879483)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 15 februarie 2013 14:40:00
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 200100
#define non(x) ((x)<=N?(x+N):(x-N))
using namespace std;

vector <int> G[nmax],Gt[nmax],deque;
int N;
bool used[nmax],mark[nmax];

void DFS(int Nod) {
	
	used[Nod]=0;
	mark[non(Nod)]=1;
	
	for(int i=0;i<Gt[Nod].size();i++)
		if(used[Gt[Nod][i]])
			DFS(Gt[Nod][i]);
	
}
void TopologicalSort(int Nod) {
	
	used[Nod]=1;
	
	for(int i=0;i<G[Nod].size();i++)
		if(!used[G[Nod][i]])
			TopologicalSort(G[Nod][i]);
	
	deque.push_back(Nod);
	
}
void solve() {
	
	int Nod;
	
	for(Nod=1;Nod<=2*N;Nod++)
		if(!used[Nod])
			TopologicalSort(Nod);
		
	reverse(deque.begin(),deque.end());
	
	for(Nod=0;Nod<2*N;Nod++)
		if(used[deque[Nod]]&&used[non(deque[Nod])])
			DFS(deque[Nod]);
	
}
void AddEdges(int x,int 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));
	
}
void read() {
	
	int x,y,color,M;
	ifstream in("andrei.in");
	in>>N>>M;
	
	while(M--) {
		
		in>>x>>y>>color;
		
		switch(color) {
			case 0:AddEdges(x,y);AddEdges(non(x),non(y));break;
			case 1:AddEdges(x,y);AddEdges(non(x),non(y));break;
			case 2:AddEdges(non(x),y);
				   AddEdges(x,non(y));break;
			}
		
		}
	
	in.close();
	
}
void write() {
	
	ofstream out("andrei.out");

	for(int i=1;i<=N;i++)
		out<<mark[i]<<' ';
	
	out<<'\n';
	out.close();
	
}
int main() {
	
	read();
	solve();
	write();
	
	return 0;
	
}