Cod sursa(job #233781)

Utilizator free2infiltrateNezbeda Harald free2infiltrate Data 19 decembrie 2008 10:58:45
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>

struct nod {int x;nod *urm;};
nod *A[10001];
int l[10001],r[10001];
bool use[10001];

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

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

nod *w;
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;
}

}

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

int n,m,e,x,y;

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

int flux=0,ok=1,i;

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

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

}