Cod sursa(job #2570929)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 4 martie 2020 20:03:16
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, e, a, b, ok, sol, i;
int R[10005], L[10005];

bitset <10005> f;

vector <int> l[10005];

int cupleaza (int nod){
    int vecin, i;
    if (f[nod] == 1){
        return 0;
    }
    f[nod] = 1;
    for (i=0; i<l[nod].size(); i++){
        vecin = l[nod][i];
        if (R[vecin] == 0){
            R[vecin] = nod;
            L[nod] = vecin;
            sol++;
            return 1;
        }
    }
    for (i=0; i<l[nod].size(); i++){
        vecin = l[nod][i];
        if (cupleaza(R[vecin])){
            R[vecin] = nod;
            L[nod] = vecin;
            return 1;
        }
    }
    return 0;
}

int main(){
    fin >> n >> m >> e;
    for (i=1; i<=e; i++){
        fin >> a >> b;
        l[a].push_back(b);
    }
    do{
        ok = 0;
        f.reset();
        for (i=1; i<=n; i++){
            if (L[i] == 0)
                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;
}
//recapitulare