Cod sursa(job #467299)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 28 iunie 2010 13:55:50
Problema Andrei Scor 15
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.41 kb
#include<cstdio>
#include<vector>
#define infile "andrei.in"
#define outfile "andrei.out"
#define nmax 100013
#define mmax 200013

using namespace std;

vector <int> nod[nmax][3]; //vecinii cu fiecare culoare al fiecarui nod
vector <int> com[nmax][2]; //inlocuim nodurile cu componente conexe
int comp[nmax]; //comp[i]=din a cata componenta conexa face parte nodul i, avand doar muchii violet (2)
char group[nmax]; //grupa din care face parte fiecare componenta conexa (A sau B)
char viz[nmax]; //vector de vizite :))
int n; //numarul de noduri
int m; //numarul de muchii
int nrc; //numarul de componente conexe
int count; //trebuie sa stim cate componente conexe avem rezolvate

void read()
{
	int i,a,b,c;
	scanf("%d %d\n",&n,&m);
	for(i=1;i<=m;++i)
	{
		scanf("%d %d %d\n",&a,&b,&c);
		nod[a][c].push_back(b);
		nod[b][c].push_back(a);
	}
}

void dfs(int x)
{
	comp[x]=nrc;
	vector <int>::iterator it;
	for(it=nod[x][2].begin();it!=nod[x][2].end();++it)
		if(!comp[*it])
			dfs(*it);
}

void dfs_com(int x)
{
	viz[x]=1;
	vector <int>::iterator it;
	int i;
	if(group[x]=='A') i=0;
	else i=1;
	for(it=com[x][i].begin();it!=com[x][i].end();++it)
		if(!viz[*it])
		{
			if(!group[*it])
			{
				++count;
				if(i==0) group[*it]='B';
				else group[*it]='A';
			}
			dfs_com(*it);
		}
}

void init()
{
	int i;

	//facem componentele conexe
	for(i=1;i<=n;++i)
		if(!comp[i])
			++nrc,dfs(i);
}

void solve()
{
	vector <int>::iterator it;
	int i,j;

	//stabilim componentele conexe ce trebuie neaparat sa fie neaparat in una din grupe
	//si construi noul graf ce inlocuieste nodurile cu componente conexe
	for(j=0;j<2;++j)
		for(i=1;i<=n;++i)
			for(it=nod[i][j].begin();it!=nod[i][j].end();++it)
				if(comp[i]==comp[*it])
				{
					++count;
					if(j==1) group[comp[i]]='A';
					else group[comp[i]]='B';
				}
				else
				{
					com[comp[i]][j].push_back(comp[*it]);
					com[comp[*it]][j].push_back(comp[i]);
				}

	//rezolvam noile "interdictii"
	//cu putin bulan 8-> :x
	while(count<nrc)
	{
		for(i=1;i<=nrc;++i)
			if(!viz[i] && group[i])
				dfs_com(i);
		if(count<nrc)
			for(i=1;i<=nrc;++i)
				if(!group[i])
				{
					group[i]='A'; //As
					++count;
					break;
				}
	}
}

void write()
{
	int i;
	for(i=1;i<=n;++i)
		if(group[comp[i]]=='A')
			printf("0 ");
		else printf("1 ");
	printf("\n");
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);

	read();
	init();
	solve();
	write();

	fclose(stdin);
	fclose(stdout);
	return 0;
}