Pagini recente » Cod sursa (job #1017287) | Cod sursa (job #390702) | Cod sursa (job #2838465) | Cod sursa (job #2979130) | Cod sursa (job #2397876)
//============================================================================
// Name : Hopcroft-Karp.cpp
// Author : Razvan
// Version :
// CopyRight : Your copyRight notice
// Description : Cuplaj maxim in graf bipartit (nr maxim de muchii care conecteaza nodurile din prima multime cu cele din a 2-a multime, fara ca unui nod sa ii fie atribuit 2 sau mai multe noduri)
//============================================================================
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 10001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector <int> G[Nmax];
int N, M, E;
bool Miscare, Used[Nmax];
int Left[Nmax], Right[Nmax];
void Read()
{
int x, y;
fin >> N >> M >> E;
for (int i=1; i<=E; i++)
{
fin >> x >> y;
G[x].push_back(y);
}
}
void InitUsed()
{
for (int i=1; i<=N; i++)
Used[i] = false;
}
bool Cupleaza(int Nod)
{
if (Used[Nod] == true)
return false;
Used[Nod] = true;
for (unsigned int i=0; i<G[Nod].size(); i++)
{
int Vecin = G[Nod][i];
if (Right[Vecin] == 0)
{
Left[Nod] = Vecin;
Right[Vecin] = Nod;
return true;
}
}
for (unsigned int i=0; i<G[Nod].size(); i++)
{
int Vecin = G[Nod][i];
if (Cupleaza(Right[Vecin]))
{
Left[Nod] = Vecin;
Right[Vecin] = Nod;
return true;
}
}
return false;
}
int main() {
Read();
do
{
InitUsed();
for (int i=1; i<=N; i++)
{
if (Left[i] == 0)
Miscare = Cupleaza(i);
}
}while (Miscare == true);
int nrCuplaje = 0;
for (int i=1; i<=N; i++)
if (Left[i] > 0)
nrCuplaje++;
fout << nrCuplaje << '\n';
for (int i=1; i<=N; i++)
{
if (Left[i] > 0)
fout << i << " " << Left[i] << '\n';
}
return 0;
}