Pagini recente » Cod sursa (job #2468381) | Cod sursa (job #2607641) | Cod sursa (job #5248) | Cod sursa (job #411561) | Cod sursa (job #968131)
Cod sursa(job #968131)
// Algoritmul Hopcroft-Karp
// Complexitate: O(sqrt(N)*M)
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;
const int NMAX = 10005;
int N,M,E,X,Y,OK,SOL,L[NMAX],R[NMAX],i;
vector<int> V[NMAX];
bitset<NMAX> Used;
void Read()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&N,&M,&E);
for(;E;E--)
{
scanf("%d%d",&X,&Y);
V[X].push_back(Y);
}
}
int PairUp(int Node)
{
if(Used[Node]) return 0;
Used[Node]=1;
for(vector<int>::iterator it=V[Node].begin();it!=V[Node].end();it++)
if(!R[*it] || PairUp(R[*it]))
{
L[Node]=*it;
R[*it]=Node;
return 1;
}
return 0;
}
void Cuplaj()
{
for(OK=1;OK;)
{
Used=0; OK=0;
for(i=1;i<=N;i++)
if(!L[i] && PairUp(i)) OK=1,SOL++;
}
}
void Print()
{
printf("%d\n",SOL);
for(i=1;i<=N;i++) if(L[i]) printf("%d %d\n",i,L[i]);
}
int main()
{
Read();
Cuplaj();
Print();
return 0;
}