Cod sursa(job #233653)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 18 decembrie 2008 20:16:19
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <string>

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

nod *A[10001];
int l[10001],r[10001];
bool use[10001];

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

nod *i;

for (i=A[x]; i;i=i->urm);
if (!l[i->x])
{
 l[i->x]=x;
 r[x]=i->x; printf("%d",x);scanf("\n");
 return 1;
}

for (i=A[x]; i;i=i->urm)
if (pairup(l[i->x]))
{
 l[i->x]=x;
 r[x]=i->x;
 return 1;
}
return 0;
}

int main()
{
FILE *in = fopen("cuplaj.in","r");
FILE *out = fopen("cuplaj.out","w");

int n,m,e,x,y;
nod *urm;
fscanf(in,"%d %d %d\n",&n,&m,&e);

for (;e;e--)
{
fscanf(in,"%d %d\n",&x,&y);
urm = new nod;
urm->x = y;
urm->urm = A[x];
A[x] = urm;
}

int flow=0,ok=1,i;

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

fprintf(out,"%d\n",flow);
for (i=1;i<=n;i++)
if (r[i]) fprintf(out,"%d %d\n",i,r[i]);


}