Cod sursa(job #320817)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 iunie 2009 21:42:18
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

#define file_in "felinare.in"
#define file_out "felinare.out"

#define Nmax 8192
#define Inf 0x3f3f3f3f
#define pb push_back
#define clear(a) memset(a,0,sizeof(a))

int cuplaj1[Nmax];
int cuplaj2[Nmax];
int n,m;
int viz[Nmax];
vector<int> v[Nmax];

inline bool cupleaza(int nod)
{
	int i;
	if (viz[nod]==1) return false;
	viz[nod]=1;
	
    for (i=0;i<v[nod].size();++i)
	{
		if (!cuplaj1[v[nod][i]])
		{
			cuplaj2[nod]=1;
			cuplaj1[v[nod][i]]=nod;
			return true;
		}
	}
	
	for (i=0;i<v[nod].size();++i)
	{
		if (!cuplaj1[v[nod][i]] && cupleaza(cuplaj1[v[nod][i]]))
		{
			cuplaj2[nod]=1;
			cuplaj1[v[nod][i]]=nod;
			return true;
		}
	}
	
	return false;
}	
	

void citire()
{
	int a,b,i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
	for (i=0;i<m;++i)
	{
		scanf("%d %d", &a,&b);
		v[a].pb(b);
	}
}

void solve()
{
	int i,ok,nrsol;   
    ok=1;   
    while(ok)   
    {   
        clear(viz);   
        ok=0;   
        for (i=1;i<=n;++i)   
        {   
            if (cuplaj2[i]==0 && cupleaza(i))   
            {   
                ok=1;   
                nrsol++;   
            }   
        }   
    }   
	
	printf("%d\n", nrsol);
}   


int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}