Cod sursa(job #236254)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 27 decembrie 2008 00:11:48
Problema Cuplaj maxim in graf bipartit Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define N 1<<14
struct nod{int inf;nod *urm;};
int n,m,e,a,b,i,cd[N],ci[N],viz[N],cuplaje,creste(int ic);
nod *v[N];
void readd(),solve(),prints();
int main()
{   readd();
    solve();
    prints();
    return 0;
}
void readd()
{   nod *paux;
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++)
     { scanf("%d%d",&a,&b);
       paux=new nod;
       paux->inf=b;
       paux->urm=v[a];
       v[a]=paux;
     }
}
void solve()
{    int gata=0;
     while (!gata)
      {   gata=1;
	  for(i=1;i<=n;i++)viz[i]=0;
	  for(i=1;i<=n;i++)
	   if(!cd[i]&&creste(i)){gata=0;cuplaje++;}
      }
}
void prints()
{   printf("%d\n",cuplaje);
    for(i=1;i<=n;i++)
     if(cd[i])printf("%d %d\n",i,cd[i]);
}
int creste(int ic)
{   nod *paux;
    if (viz[ic]) return 0;
    viz[ic] = 1;
    for(paux=v[ic];paux;paux=paux->urm)
     if (!ci[paux->inf]){ci[paux->inf]=ic;cd[ic]=paux->inf;return 1;}
    for(paux=v[i];paux;paux=paux->urm)
     if (creste(ci[paux->inf])){ci[paux->inf]=ic;cd[ic]=paux->inf;return 1;}
    return 0;
}