Cod sursa(job #419479)

Utilizator otilia_sOtilia Stretcu otilia_s Data 17 martie 2010 16:12:31
Problema Felinare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 8193
short st[NMAX],dr[NMAX],nv[NMAX];
bool Sst[NMAX],Sdr[NMAX],uz[NMAX];
vector <short> A[NMAX];
short n,m,cup;


void citire()
{
	ifstream fin("felinare.in");
	fin>>n>>m;
	short i;
	for (i=1;i<=m;++i)
	{ short x,y;
		fin>>x>>y;
		A[x].push_back(y);		
	}
	fin.close();
}

bool cupleaza(int x)
{ short i;
	if (uz[x]) return 0;
	uz[x]=true;
	for (i=0;i<nv[x];++i)
		if (!dr[A[x][i]])
			{
				dr[A[x][i]]=x;
				st[x]=A[x][i];
				return 1;
			}
	for (i=0;i<nv[x];++i)	
		if (cupleaza(dr[A[x][i]]))
			{
				st[x]=A[x][i];
				dr[A[x][i]]=x;
				return 1;
			}
	return 0;	
}

void suport(short x)
{ short i;
	for (i=0;i<nv[x];++i)
	 if (!Sdr[A[x][i]])
		{
		 Sdr[A[x][i]]=true;
		 Sst[dr[A[x][i]]]=false;
		 suport(dr[A[x][i]]);
		}
}

void afisare()
{
	ofstream fout("felinare.out");
	
	fout<<2*n-cup<<"\n";
	short i;
	for (i=1;i<=n;++i)	
	 if (!Sst[i])
		if (!Sdr[i]) fout<<"3\n";
			else fout<<"1\n";
		else
		 if (!Sdr[i]) fout<<"2\n";
		    else fout<<"0\n";
		//fout<<1-Sst[i]+2*(1-Sdr[i])<<"\n";
	fout.close();
}

int main()
{
  citire();
  
  //cuplaj
   short i;
   for (i=1;i<=n;++i) 
   { st[i]=dr[i]=0; nv[i]=A[i].size();}
  
  bool change;
  do
  {
	change=false;
	memset(uz,0,sizeof(uz));
	for (i=1;i<=n;++i)
	 if (!st[i])
	     change|=cupleaza(i);
  }
  while (change);
  
  cup=0;
  for (i=1;i<=n;++i) 
	if (st[i]) {++cup; Sst[i]=1;}
  //suport
  for (i=1;i<=n;++i)
	if (!Sst[i]) suport(i);
  
  afisare();
  return 0;
}