Cod sursa(job #780771)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 21 august 2012 17:53:40
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
/*Cuplaj maxim in graf bipartit*/
#include<cstdio>
#include<list>
#include<algorithm>
using namespace std;

int N,M,E,i,u,v;
list<int> L[10001];
int cuplN[10001],cuplM[10001],viz[10001];
int change,nr;

int cupleaza(int xu)
{if(viz[xu]) return 0;
 list<int>::iterator it;
 for(it=L[xu].begin(); it!=L[xu].end(); it++)
  {int xv=*it;
   if(cuplM[xv]==0)   
      {cuplM[xv]=xu; cuplN[xu]=xv;
       nr++;
       return 1;}
  }
 
 viz[xu]=1; 
 for(it=L[xu].begin(); it!=L[xu].end(); it++)
   {int xv=*it; 
    if(cuplM[xv]!=0 && cupleaza(cuplM[xv]))
      {cuplM[xv]=xu; cuplN[xu]=xv;
       return 1;}
   }    
 return 0;  
}

int main()
{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",&u,&v);
 L[u].push_back(v);}
change=1;
while(change)
{change=0;
 for(u=1; u<=N; u++)
   if(cuplN[u]==0)
      change=cupleaza(u);
}
printf("%d\n",nr);
for(i=1; i<=max(N,M); i++)
 if(cuplN[i]!=0)
   printf("%d %d\n",i,cuplN[i]);  
return 0;}