Pagini recente » Cod sursa (job #955487) | Cod sursa (job #944546) | Cod sursa (job #2297594) | Cod sursa (job #2221998) | Cod sursa (job #806831)
Cod sursa(job #806831)
// Algoritmul Hapcroft Karp optimizeaza ideea de cuplaj cu lanturi
// alternante , rafinand-o. El face toate cuplajele posibile fara a
// modifica tot ce am facut la pasul actual. Deci intai vom face un
// cuplaj cu tot ce se poate si apoi la fiecare pas il vom imbunatati.
// Viteza acestui algoritm este de O(sqrt(N)*L).
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream F("cuplaj.in");
ofstream G("cuplaj.out");
const int Nmax = 10010;
vector<int> A[Nmax];
int Fixed[Nmax];
int L[Nmax],R[Nmax];
int N,M,T,Sol;
typedef vector<int>::iterator IT;
int Look( int Nod )
{
if ( Fixed[Nod] == 1 ) return 0;
Fixed[Nod] = 1;
for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
if ( R[*it] == 0 )
{
L[ Nod ] = *it;
R[ *it ] = Nod;
return 1;
}
for (IT it=A[Nod].begin();it!=A[Nod].end();++it)
if ( Look( R[*it] ) )
{
L[ Nod ] = *it;
R[ *it ] = Nod;
return 1;
}
return 0;
}
int main()
{
F>>N>>M>>T;
for (int i=1,x,y;i<=T;++i)
{
F>>x>>y;
A[x].push_back(y);
}
for ( bool Ok=1; Ok ; )
{
Ok = 0;
memset( Fixed, 0 , sizeof(Fixed) );
for (int i=1;i<=N;++i)
if ( L[i] == 0 )
Ok |= Look( i );
}
for (int i=1;i<=N;++i) Sol+=L[i]!=0;
G<<Sol<<'\n';
for (int i=1;i<=N;++i)
if ( L[i] )
G<<i<<' '<<L[i]<<'\n';
}