Cod sursa(job #1210711)

Utilizator mariusn01Marius Nicoli mariusn01 Data 20 iulie 2014 21:50:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#define DIM 100010
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector<int> V[DIM];

int L[DIM], R[DIM], U[DIM], nr, ok, i, n, m, k, x, y;

//L[i] = perechea din dreapta a nodului i din stanga
//R[i] = perechea din stanga a elemenrului i din dreapta

int cupleaza(int nod) {
    if (U[nod] == 1)
        return  0;
    U[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;
            nr++;
            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>>k;
    for (i=1;i<=k;i++) {
        fin>>x>>y;
        V[x].push_back(y);
    }

    do {
        ok = 0;
        for (i=1;i<=n;i++)
            U[i] = 0;

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

    fout<<nr<<"\n";
    for (i=1;i<=n;i++)
        if (L[i])
            fout<<i<<" "<<L[i]<<"\n";

    return 0;
}