Pagini recente » Cod sursa (job #501094) | Cod sursa (job #1081360) | Cod sursa (job #40389) | Cod sursa (job #239571) | Cod sursa (job #347490)
Cod sursa(job #347490)
/*
Hopcroft - Karp
Complexitate : O(E * sqrt(V))
*/
#include<stdio.h>
struct Nod {
int V;
Nod *Next;
};
int L[10005];
int R[10005];
int nL;
int Res;
int ok;
int xM;
int yM;
int CMax;
int use[10005];
int nR;
int M;
Nod *a[10005];
void insert(Nod *&K, int Val)
{
Nod *nAux = new Nod;
nAux -> V = Val;
nAux -> Next = K;
K = nAux;
}
int PrUp(int i)
{
if (use[i])
return 0;
use[i] = 1;
for(Nod *it = a[i]; it; it = it -> Next)
if (!L[it -> V])
{
L[it -> V] = i;
R[i] = it -> V;
return 1;
}
for(Nod *it = a[i]; it; it = it -> Next)
if (PrUp(L[it -> V]))
{
L[it -> V] = i;
R[i] = it -> V;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&nL, &nR, &M);
for(int i = 1; i <= M; i++)
{
scanf("%d %d",&xM,&yM);
insert(a[xM],yM);
}
do
{
ok = 0;
for(int i = 1; i <= nL; i++)
use[i] = 0;
for(int i = 1; i <= nL; i++)
if (!R[i])
if (PrUp(i))
ok = Res++;
}
while (ok);
printf("%d\n", Res);
for(int i = 1; i <= nL; i++)
if (R[i])
{
printf("%d %d\n", i, R[i]);
}
}