Cod sursa(job #266327)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 25 februarie 2009 11:46:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <string.h>
#define nmax 10001


struct nod
{
int x;
nod *urm;
};
nod *A[nmax];

int l[nmax],r[nmax],use[nmax];

int pairup(int x)
{
if (use[x]) return 0;
use[x] = 1;

nod *w = A[x];

while (w!=NULL)
{
if (!l[w->x])
   {
   l[w->x] = x;
   r[x] = w->x;
   return 1;
   }
w = w->urm;
}

w = A[x];

while (w!=NULL)
{
if (pairup(l[w->x]))
	{
	l[w->x] = x;
	r[x] = w->x;
	return 1;
	}
w = w->urm;
}
return 0;
}

void add(int x,int y)
{
nod *urm = new nod;
urm->x = y;
urm->urm = A[x];
A[x] = urm;
}

int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);

int n,m,e,x,y;
scanf("%d%d%d",&n,&m,&e);
while (e)
{
e--;
scanf("%d%d",&x,&y);
add(x,y);
}


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

printf("%d\n",flux);
for (i=1;i<=n;i++) if(r[i]) printf("%d %d\n",i,r[i]);


return 0;
}