Cod sursa(job #1758247)

Utilizator preda.andreiPreda Andrei preda.andrei Data 16 septembrie 2016 20:49:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define NMAX 10001

vector<int> A[NMAX];
int vecinInA[NMAX];
int vecinInB[NMAX];
vector<bool> vizitat(NMAX);

vector< pair<int, int> > aflaCuplajMaxim(int n);
bool cupleaza(int nod);

int main()
{
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");

    int n, m, k;
    fin >> n >> m >> k;

    while (k--) {
        int x, y;
        fin >> x >> y;
        A[x].push_back(y);
    }

    auto cuplaj = aflaCuplajMaxim(n);

    fout << cuplaj.size() << "\n";
    for (auto muchie : cuplaj)
        fout << muchie.first << " " << muchie.second << "\n";

    return 0;
}

vector< pair<int, int> > aflaCuplajMaxim(int n)
{
    bool cuplajNou;
    do {
        cuplajNou = false;

        for (int i = 1; i <= n; ++i) {
            if (!vecinInB[i] && cupleaza(i))
                cuplajNou = true;
        }

        if (cuplajNou) {
            for (int i = 1; i <= n; ++i)
                vizitat[i] = false;
        }

    } while (cuplajNou);

    vector< pair<int, int> > sol;
    for (int i = 1; i <= n; ++i) {
        if (vecinInB[i])
            sol.push_back({i, vecinInB[i]});
    }
    return sol;
}

bool cupleaza(int nod)
{
    if (vizitat[nod])
        return false;
    vizitat[nod] = true;

    for (int v : A[nod]) {
        if (!vecinInA[v]) {
            vecinInB[nod] = v;
            vecinInA[v] = nod;
            return true;
        }
    }

    for (int v : A[nod]) {
        if (cupleaza(vecinInA[v])) {
            vecinInB[nod] = v;
            vecinInA[v] = nod;
            return true;
        }
    }

    return false;
}