Cod sursa(job #381103)

Utilizator AndreyPAndrei Poenaru AndreyP Data 8 ianuarie 2010 21:31:08
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#include<bitset>
#include<vector>
#include<string.h>
using namespace std;
#define N 8200
#define pb push_back
int n,m;
bitset<N> viz,sa,sb;
vector<int> a[N];
int ca[N],cb[N];
char rez[N];
inline void citire()
{
	scanf("%d%d",&n,&m);
	int x,y;
	for(int i=0; i<m; ++i)
	{
		scanf("%d%d",&x,&y);
		a[x].pb(y);
	}
	memset(rez,3,sizeof(rez));
}
bool pairUp(int nod)
{
	if(viz[nod]==1)
		return false;
	viz[nod]=1;
	for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
	{
		if(cb[a[nod][i]]==0)
		{
			ca[nod]=a[nod][i];
			cb[a[nod][i]]=nod;
			sa[nod]=1;
			return true;
		}
	}
	for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
	{
		if(pairUp(cb[a[nod][i]]))
		{
			ca[nod]=a[nod][i];
			cb[a[nod][i]]=nod;
			sa[nod]=1;
			return true;
		}
	}
	return false;
}
void suport(int nod)
{
	if(nod==0)
		return;
	for(size_t i=0,lim=a[nod].size(); i<lim; ++i)
	{
		if(sb[a[nod][i]]==0)
		{
			sb[a[nod][i]]=1;
			sa[cb[a[nod][i]]]=0;
			suport(cb[a[nod][i]]);
		}
	}
}
inline void rezolva()
{
	bool change=true;
	int r=0;
	while(change)
	{
		change=false;
		viz.reset();
		for(int i=1; i<=n; ++i)
		{
			if(ca[i]==0 && viz[i]==0)
			{
				if(pairUp(i)==true)
				{
					change|=true;
					++r;
				}
			}
		}
	}
	printf("%d\n",(n<<1)-r);
	for(int i=1; i<=n; ++i)
	{
		if(sa[i]==0)
			suport(i);
	}
}
inline void scrie()
{
	for(int i=1; i<=n; ++i)
	{
		fputc(rez[i]-(sa[i]==1 ? 1 : 0)-(sb[i]==1 ? 2 : 0)+'0',stdout);
		fputc('\n',stdout);
	}
}
int main()
{
	freopen("felinare.in","r",stdin);
	freopen("felinare.out","w",stdout);
	citire();
	rezolva();
	scrie();
	return 0;
}