Cod sursa(job #2666615)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 2 noiembrie 2020 11:16:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
#define dim 10010
using namespace std;
vector <int> a[dim];
bitset<dim> f;
int l[dim];
int r[dim];
int i,n,m,q,sol,ok,x,y;

int cuplaj (int nod) {
    if (f[nod]==1) return 0;
    f[nod]=1;
    for (int i=0;i<a[nod].size();i++) {
        int vecin=a[nod][i];
        if (r[vecin]==0) {
            r[vecin]=nod;
            l[nod]=vecin;
            sol++;
            return 1;
        }
    }
    for (int i=0;i<a[nod].size();i++) {
        int vecin=a[nod][i];
        if (cuplaj(r[vecin])) {
            r[vecin]=nod;
            l[nod]=vecin;
            return 1;
        }
    }
    return 0;
}

int main() {
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin>>n>>m>>q;
    for (;q--;) {
        fin>>x>>y;
        a[x].push_back(y);
    }
    ok=1;
    while (ok) {
        ok=0;
        f.reset();
        for (i=1;i<=n;i++) {
            if (l[i]==0&&cuplaj(i)) {
                ok=1;
            }
        }
    }
    fout<<sol<<"\n";
    for (i=1;i<=n;i++) {
        if (l[i]) fout<<i<<" "<<l[i]<<"\n";
    }
    return 0;
}