Cod sursa(job #222564)

Utilizator gigi_becaliGigi Becali gigi_becali Data 23 noiembrie 2008 14:29:08
Problema Felinare Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <string>
#define N 8200

struct nod { int x; nod *n;};

nod *a[N];
int n, m;
bool use[N];
int l[N], r[N], sl[N], sr[N];

inline void add(int x, int y)
{
    nod *p=new nod ;
    p->x=y;
    p->n=a[x];
    a[x]=p;
}


void read()
{
    freopen("felinare.in","r",stdin);
    scanf("%d %d\n", &n,&m);

    int p,q;
    while(m--)
    {
	scanf("%d %d\n", &p, &q);
	add(p,q);
    }
}

inline bool pairup(int n)
{
    if(use[n]) return 0;
    use[n]=1;

    for(nod *i=a[n]; i; i=i->n)
	if(!l[i->x])
	{
	    l[i->x]=n;
	    r[n]=i->x;
	    return 1;
	}

    for(nod *i=a[n]; i; i=i->n)
	if(pairup(i->x))
	{
	    l[i->x]=n;
	    r[n]=i->x;
	    return 1;
	}

    return 0;
}


void hopcroft_karp()
{

    int ok=1,i,flow=0;

    while(ok)
    {
	ok=0;
	memset(use, 0, sizeof(use));
	for(i=1;i<=n;++i)
	    if(!r[i])
		if(pairup(i)) ++flow,ok=1;
    }

    flow=0;
    for(i=1;i<=n;++i)
	if(r[i]) ++flow;
   
   freopen("felinare.out","w",stdout); 
    printf("%d\n", 2*n-flow);

    return ;
    for(i=1;i<=n;++i)
	if(l[i] == 0) sl[i]=1;

    for(i=1;i<=n;++i)
	if(r[i] == 1) sr[i]=1;

    for(i=1;i<=n;++i)
	printf("%d\n", 1-(sl[i])+2*(1-sr[i]));
}

int main()
{
    read();
    hopcroft_karp();
    
    return 0;
}