Cod sursa(job #553666)

Utilizator mihaionlyMihai Jiplea mihaionly Data 14 martie 2011 11:04:21
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
using namespace std;
FILE *fin=fopen("cuplaj.in","r");
FILE *fout=fopen("cuplaj.out","w");
#define NMAX 100005
int n,m,t,sol;
struct graf {
graf *urm;
int x;
} *G[NMAX];
int gs[NMAX],gd[NMAX];
void add(graf *&g,int x)
 {
 graf *p=new graf;
 p->x=x;
 p->urm=g;
 g=p;
 }
bool cuplaj(int nod)
 {
 for(graf *g=G[nod];g!=NULL;g=g->urm)
  {
  if(!gs[g->x])
   {
   gs[g->x]=nod;
   gd[nod]=g->x;
   return true;
   }
  }
 for(graf *g=G[nod];g!=NULL;g=g->urm)
  {
  if(gs[g->x]!=nod&&cuplaj(gs[g->x]))
   {
   gs[g->x]=nod;
   gd[nod]=g->x;
   return true;
   }
  }
 return false;
 }
int main()
 {
 int i,x,y;
 fscanf(fin,"%d %d %d",&n,&m,&t);
 for(i=1;i<=t;i++)
  {
  fscanf(fin,"%d %d",&x,&y);
  add(G[x],y);
  }
 for(i=1;i<=n;i++)
  {
  if(cuplaj(i))
   ++sol;
  }
 fprintf(fout,"%d\n",sol);
 for(i=1;i<=n;i++)
  {
  if(gd[i])
   fprintf(fout,"%d %d\n",i,gd[i]);
  }
 return 0;
 }