Pagini recente » Cod sursa (job #460716) | Cod sursa (job #2239713) | Cod sursa (job #471424) | Cod sursa (job #1475288) | Cod sursa (job #1867746)
// Algoritmului lui Hopcroft Karp
// Complexitate O(sqrt(V)*E)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
using VI = vector<int>;
vector<VI> G;
VI l, r, u;
int N, M, E;
void ReadGraph();
void HopcroftKarp();
bool PairUp( int x );
void Write();
int main()
{
ReadGraph();
/* for ( int i = 1; i <= N; ++i )
{
cout << i << ": ";
for ( const int& x : G[i] )
cout << x << ' ';
cout << '\n';
} */
HopcroftKarp();
Write();
fin.close();
fout.close();
return 0;
}
void ReadGraph()
{
int x, y;
fin >> N >> M >> E;
G = vector<VI>(N + 1);
u = l = VI(N + 1);
r = VI(M + 1);
while ( E-- )
{
fin >> x >> y;
G[x].push_back(y);
}
}
void HopcroftKarp()
{
bool gt = false;
while ( !gt )
{
gt = true;
u = VI(N + 1, 0);
for ( int i = 1; i <= N; ++i )
if ( !l[i] )
if ( PairUp(i) )
{
gt = false;
}
}
}
bool PairUp( int x )
{
if ( u[x] ) return false;
u[x] = 1;
for ( const auto& v : G[x] )
if ( !r[v] )
{
l[x] = v;
r[v] = x;
return true;
}
for ( const auto& v : G[x] )
if ( PairUp(r[v]) )
{
l[x] = v;
r[v] = x;
return true;
}
return false;
}
void Write()
{
int cuplaj{0};
for ( int i = 1; i <= N; ++i )
if ( l[i] )
++cuplaj;
fout << cuplaj << '\n';
for ( int i = 1; i <= N; ++i )
if ( l[i] )
fout << i << ' ' << l[i] << '\n';
}