Cod sursa(job #306548)

Utilizator tibiletsKoos Tiberiu Iosif tibilets Data 21 aprilie 2009 12:06:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<fstream.h>
struct nod
{short inf;
 nod *adr;}*G[10001];
short L[10001],R[10001],F[10001],N,M,u,v,sf,i,c;
void ad(short u,short v)
{nod* p=new nod;
 p->inf=v;
 p->adr=G[u];
 G[u]=p;}
short caut(short u)
{if(F[u])return 0;
 F[u]=1;
 nod* p=G[u];
 while(p)
 {if(!R[p->inf]) 
  {R[p->inf]=u;
   L[u]=p->inf;
   return 1;}
  p=p->adr;}
 p=G[u];
 while(p)
 {if(caut(R[p->inf]))
  {R[p->inf]=u;
   L[u]=p->inf;
   return 1;}
  p=p->adr;}
 return 0;}
int main()
{ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int E;
f>>N>>M>>E;
for(;E;--E)
{f>>u>>v;
 ad(u,v);}
while(!sf)
{sf=1;
 memset(F,0,sizeof(F));
 for(i=1;i<=N;++i)
  if(!L[i]&&caut(i))
   sf=0;}
for(i=1;i<=N;++i)
 if(L[i])
  ++c;
g<<c<<'\n';
for(i=1;i<=N;++i)
 if(L[i])
  g<<i<<' '<<L[i]<<'\n';
return 0;
}