Cod sursa(job #240111)

Utilizator RobybrasovRobert Hangu Robybrasov Data 6 ianuarie 2009 21:11:43
Problema Cuplaj maxim in graf bipartit Scor 74
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
#include <cstring>
#define N 10001

typedef struct noduri
{
	int val;
	noduri *urm;
} adr;

int n,m,e,i,j,tata[N],x,y;
short int E[N];
adr *L[N],*p;

int dfs(int x)
{
    adr *p;
    if (x==-1) return 1;
    if (E[x]) return 0;
    E[x] = 1;
    for (p=L[x]; p; p=p->urm)
        if (dfs(tata[p->val]))
        {
            tata[p->val] = x;
            return 1;
        }
    return 0;
}

int flux()
{
    int rez=0;
    memset(tata,-1,sizeof(tata));
    for (i=1; i<=n; i++)
    {
        memset(E,0,sizeof(E));
        if (dfs(i)) rez++;
    }
    return rez;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d\n",&n,&m,&e);
	for (i=1; i<=e; i++)
	{
	    scanf("%d%d\n",&x,&y);
	    p=new adr;
	    p->val=y; p->urm=L[x];
	    L[x]=p;
	}
	printf("%d\n",flux());
	for (i=1; i<=n; i++)
        if (tata[i]>0) printf("%d %d\n",tata[i],i);

    return 0;
}