Cod sursa(job #2246215)

Utilizator osiaccrCristian Osiac osiaccr Data 26 septembrie 2018 19:59:08
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DEF 10010

using namespace std;

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

int n, m, e, sol, L[DEF], R[DEF];

vector < int > V[DEF];

bitset < DEF > Viz;

int cupleaza (int nod) {

    if (Viz[nod]) {
        return 0;
    }

    Viz[nod] = 1;

    for (int i = 0; i < V[nod].size (); ++ i) {
        if (R[V[nod][i]] == 0) {
            L[nod] = V[nod][i];
            R[V[nod][i]] = nod;
            ++ sol;
            return 1;
        }
    }

    for (int i = 0; i < V[nod].size (); ++ i) {
        if (cupleaza (R[V[nod][i]])) {
            L[nod] = V[nod][i];
            R[V[nod][i]] = nod;
            return 1;
        }
    }

    return 0;

}

int main () {

    fin >> n >> m >> e;
    for (int i = 1; i <= e; ++ i) {
        int x, y;
        fin >> x >> y;
        V[x].push_back (y);
    }

    bool ok;
    do {

        ok = false;

        Viz.reset ();

        for (int i = 1; i <= n; ++ i) {
            if (L[i] == 0) {
                ok += cupleaza (i);
            }
        }

    } while (ok);

    fout << sol << "\n";
    for (int i = 1; i <= n; ++ i) {
        if (L[i] != 0) {
            fout << i << " " << L[i] << "\n";
        }
    }

    return 0;
}