Cod sursa(job #1155217)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 26 martie 2014 19:13:16
Problema Andrei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<string.h>
using namespace std;

#define NMAX 200001

vector <int> v[NMAX],vt[NMAX],SCC[NMAX];
int viz[NMAX],p[NMAX],sol[NMAX],poz[NMAX],n,nr;

inline int NEG(int x)
{
	int aux = x + n;
	if(aux>2*n)
		aux=aux-2*n;
	return aux;
}

void dfs(int nod)
{
	viz[nod]=1;
	for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++)
		if(viz[*it]==0)
			dfs(*it);
	p[++p[0]]=nod;
}

void dfst(int nod)
{
	viz[nod]=1;
	SCC[nr].push_back(nod);
	poz[nod]=nr;
	for(vector <int> :: iterator it=vt[nod].begin();it!=vt[nod].end();it++)
		if(viz[*it]==0)
			dfst(*it);
}

void add(int x, int y)
{
	v[NEG(x)].push_back(y);
	v[NEG(y)].push_back(x);
	vt[y].push_back(NEG(x));
	vt[x].push_back(NEG(y));
}

int main ()
{
	int m,x,y,col,i;
	ifstream f("andrei.in");
	ofstream g("andrei.out");
	f>>n>>m;
	for(i=1;i<=m;i++) {
		f>>x>>y>>col;
		if(col==0)
			add(x,y);
		else if(col==1)
			add(x+n,y+n);
		else {
			add(x+n,y);
			add(x,y+n);
		}
	}
	f.close();
	for(i=1;i<=2*n;i++)
		if(viz[i]==0)
			dfs(i);
	memset(viz,0,sizeof(viz));
	for(i=p[0];i>=1;i--)
		if(viz[p[i]]==0) {
			nr++;
			dfst(p[i]);
		}
	for(i=1;i<=2*n;i++)
		sol[i]=-1;
	for(i=nr;i>=1;i--) {
		if(sol[SCC[i][0]]!=-1)
			continue;
		for(vector <int> :: iterator it=SCC[i].begin();it!=SCC[i].end();it++) {
			sol[*it]=1;
			sol[NEG(*it)]=0;
		}
	}
	for(i=1;i<=n;i++)
		g<<sol[i]<<" ";
	g.close();
	return 0;
}