Cod sursa(job #1494580)

Utilizator mariusn01Marius Nicoli mariusn01 Data 1 octombrie 2015 14:19:05
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <vector>
#include <bitset>
#define DIM 10010
using namespace std;

vector<int> V[DIM];
int L[DIM], R[DIM], n, m, k, i, ok, x, y, sol;
//L[i] = vecinul din dreapta din cuplaj al jodului i din stanga sau 0 daca nodul i nu e cuplat
//R[i] = vecinul din stanga din cuplaj al jodului i din dreapta sau 0 daca nodul i nu e cuplat
bitset<DIM> U;

int cupleaza(int nod) {
    // incerc sa cuplez pe nod (aflat inb stanga si necuplat cu cineva)
    // incerc sa cuplez pe nod direct cu un element din
    if (U[nod] == 1)
        return 0;

    U[nod] = 1;

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

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

    return 0;
}

int main () {

    ifstream fin ("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin>>n>>m>>k;
    for (i=1;i<=k;i++) {
        fin>>x>>y;
        V[x].push_back(y);
    }

    do {


        ok = 0;
        U.reset();

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

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

    return 0;
}