Pagini recente » Cod sursa (job #510922) | Cod sursa (job #62208) | Cod sursa (job #2710643) | Cod sursa (job #2339555) | Cod sursa (job #3207919)
#include <fstream>
using namespace std;
ifstream cin ("cuplaj.in");
ofstream cout ("cuplaj.out");
struct Muchie { int nod_vecin , urmatorul; } muchii[100001];
int capat[10001] , pereche[2][10001];
bool vizitat[10001];
bool CautaPereche (const int nod_actual)
{
if (vizitat[nod_actual])
{ return false; }
vizitat[nod_actual] = true;
for (int indice = capat[nod_actual] ; indice ; indice = muchii[indice].urmatorul) {
if (!pereche[1][muchii[indice].nod_vecin])
{
pereche[0][nod_actual] = muchii[indice].nod_vecin;
pereche[1][muchii[indice].nod_vecin] = nod_actual;
return true;
}
}
for (int indice = capat[nod_actual] ; indice ; indice = muchii[indice].urmatorul) {
if (CautaPereche(pereche[1][muchii[indice].nod_vecin]))
{
pereche[0][nod_actual] = muchii[indice].nod_vecin;
pereche[1][muchii[indice].nod_vecin] = nod_actual;
return true;
}
}
return false;
}
int main ()
{
int numar_noduri[2] , numar_muchii;
cin >> numar_noduri[0] >> numar_noduri[1] >> numar_muchii;
for (int indice = 1 , nod_actual ; indice <= numar_muchii ; indice++)
{
cin >> nod_actual >> muchii[indice].nod_vecin;
muchii[indice].urmatorul = capat[nod_actual];
capat[nod_actual] = indice;
}
while (true)
{
bool gasit = false;
for (int nod_candidat = 1 ; nod_candidat <= numar_noduri[0] ; nod_candidat++)
{ if (!pereche[0][nod_candidat]) { gasit |= CautaPereche(nod_candidat); } }
for (int indice = 1 ; indice <= numar_noduri[0] ; indice++)
{ vizitat[indice] = false; }
if (!gasit)
{ break; }
}
int cuplaj = 0;
for (int indice = 1 ; indice <= numar_noduri[0] ; indice++)
{ cuplaj += (pereche[0][indice] != 0); }
cout << cuplaj << '\n';
for (int indice = 1 ; indice <= numar_noduri[0] ; indice++) {
if (pereche[0][indice])
{ cout << indice << ' ' << pereche[0][indice] << '\n'; }
}
cout.close(); cin.close();
return 0;
}