Cod sursa(job #1022745)

Utilizator geniucosOncescu Costin geniucos Data 5 noiembrie 2013 21:47:10
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<vector>
using namespace std;
/////////////////////////////////////////////////////////////cuplajul
int i,j,n,m,urm[8300],prec[8300],C[8300];
vector < int > v[8300];
bool cup(int nod)
{
    if(C[nod]==1) return 0;
    C[nod]=1;
    vector < int > :: iterator it;
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(prec[*it]==0)
        {
            prec[*it]=nod;
            urm[nod]=*it;
            return 1;
        }
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(cup(prec[*it]))
        {
            prec[*it]=nod;
            urm[nod]=*it;
            return 1;
        }
    return 0;
}
int cuplaj()
{
    int i,ok=1;
    for(i=1;i<=n;i++)
        C[i]=urm[i]=prec[i]=0;
    while(ok)
    {
        ok=0;
        for(i=1;i<=n;i++)
            C[i]=0;
        for(i=1;i<=n;i++)
            if(urm[i]==0) ok+=cup(i);
    }
    ok=0;
    for(i=1;i<=n;i++)
        ok+=(urm[i]>0);
    return ok;
}
////////////////////////////////////////////////////
int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
while(m)
{
    m--;
    scanf("%d",&i);
    scanf("%d",&j);
    v[i].push_back(j);
}
printf("%d\n",2*n-cuplaj());
return 0;
}