Cod sursa(job #913543)

Utilizator raulstoinStoin Raul raulstoin Data 13 martie 2013 16:53:05
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<cstdio>
#include<vector>
#define NMAX 8200
#define vec G[nod][i]
using namespace std;
FILE *fin,*fout;
vector<short> G[NMAX];
short n,l[NMAX],r[NMAX],c;
bool use[NMAX],useL[NMAX],useR[NMAX];
void read()
{
	fin=fopen("felinare.in","r");
	short m,x,y;
	fscanf(fin,"%hd %hd",&n,&m);
	while(m--)
	{
		fscanf(fin,"%hd %hd",&x,&y);
		G[x].push_back(y);
	}
	fclose(fin);
}
void print()
{
	fout=fopen("felinare.out","w");
	fprintf(fout,"%hd\n",2*n-c);
	for(int i=1;i<=n;i++)
		fprintf(fout,"%hd\n",(1^useL[i])+2*(1^useR[i]));
	fclose(fout);
}
bool pairup(int nod)
{
	if(use[nod])
		return 0;
	use[nod]=1;
	for(size_t i=0;i<G[nod].size();i++)
		if(!l[vec] || pairup(l[vec]))
		{
			l[vec]=nod;
			r[nod]=vec;
			useL[nod]=1;
			return 1;
		}
	return 0;
}
void suport(int nod)
{
	for(size_t i=0;i<G[nod].size();i++)
		if(!useR[vec])
		{
			useR[vec]=1;
			useL[l[vec]]=0;
			suport(l[vec]);
		}
}
void solve()
{
	for(short sw=1;sw;)
	{
		for(int i=0;i<=n;i++)
			use[i]=0;
		sw=0;
		for(int i=1;i<=n;i++)
			if(!r[i])
				sw|=pairup(i);
	}
	for(int i=1;i<=n;i++)
		if(l[i])
			c++;
	for(int i=1;i<=n;i++)
		if(!useL[i])
			suport(i);
}
int main()
{
	read();
	solve();
	print();
	return 0;
}