Cod sursa(job #1414576)

Utilizator azkabancont-vechi azkaban Data 2 aprilie 2015 19:32:34
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;
int i,j,k,n,m,e,a,b;
int lmatch[10013];
int rmatch[10013];
bool   viz[10013];
vector <int> G[10013];


int Hopckroft(int nod)
{
 if (viz[nod]) return 0;
 viz[nod]=1;
 vector <int>::iterator it;
 for (it=G[nod].begin();it!=G[nod].end();++it)
      if (!rmatch[*it])
              {
              rmatch[*it]=nod;
              lmatch[nod]=*it;
              return 1;
			  }
 for (it=G[nod].begin();it!=G[nod].end();++it)
      if (Hopckroft(rmatch[*it]))
              {
              rmatch[*it]=nod;
              lmatch[nod]=*it;
              return 1;
			  }	
 return 0;	
}

int main (void)
{
 ifstream cin("cuplaj.in");
 ofstream cout("cuplaj.out");
 cin>>n>>m>>e;
 while(e--)
   {
   	cin>>a>>b;
   	G[a].push_back(b);
   }
 int cuplare(1);
 while(cuplare)
      {
       cuplare=0;
       memset(viz,0,sizeof viz);
       for (i=1;i<=n;++i)
         if (!lmatch[i])
           cuplare+=Hopckroft(i);
	  }
 int sol(0);
 for (i=1;i<=n;++i)
   if (lmatch[i]) ++sol;
 cout<<sol<<"\n";
 for (i=1;i<=n;++i)
   if (lmatch[i])
     cout<<i<<" "<<lmatch[i]<<"\n";
 return 0;
}