Cod sursa(job #320819)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 5 iunie 2009 21:48:47
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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]]!=nod && 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=0;   
    //ok=1;   
    for (i=1;i<=n;++i)   
    {
		clear(viz);
        nrsol+=cupleaza(i);   
    }   
	
	printf("%d\n", 2*n-nrsol);
}   


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