Cod sursa(job #407435)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 2 martie 2010 12:37:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
using namespace std;
#define MAX 10006
#include<cstdio>
struct nod{
    int info;
    nod *next;
};
nod *G[MAX];
int n,m,nrcuplaj,u[MAX],R[MAX],L[MAX];

void citire()
{
    int e,a,b;
    scanf("%d %d %d", &n, &m, &e);
    for(int i=1;i<=e;i++)
    {
        scanf("%d %d", &a, &b);
        nod *p=new nod;
        p->info=b;
        p->next=G[a];
        G[a]=p;
    }
}

void write()
{
	printf("%d\n",nrcuplaj);
	for(int i=1;i<=n;i++)
		if(L[i])
			printf("%d %d\n",i,L[i]);
}


int pereche(int x)
{
    if(u[x]==1)
        return 0;
    u[x]=1;
    for(nod *p=G[x]; p ; p=p->next)
    {
        int i=p->info;
        if(R[i]==0 || pereche(R[i]))
        {
            L[x]=i,R[i]=x;
            return 1;
        }
    }
    return 0;
}


void cuplaj()
{
    int gata=0,i;
    while(!gata)
    {
        gata=1;
        for(i=1;i<=n;i++)
            u[i]=0;
        for(i=1;i<=n;i++)
            if(L[i]==0)
                if(pereche(i)==1)
                    nrcuplaj++, gata=0;
    }
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    citire();
    cuplaj();
    write();
    return 0;
}