Cod sursa(job #3207919)

Utilizator SSKMFSS KMF SSKMF Data 27 februarie 2024 08:14:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#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;
}