Cod sursa(job #2664218)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 28 octombrie 2020 10:21:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>
#include <cstring>
#define dim 10010
using namespace std;
vector<int> a[dim];
int f[dim];
int l[dim];
int r[dim];
int i,n,m,k,sol,ok,x,y;

int cupleaza (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 (cupleaza(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>>k;
    for (i=1;i<=k;i++) {
        fin>>x>>y;
        a[x].push_back(y);
    }
    ok=1;
    while (ok) {
        ok=0;
        memset(f,0,sizeof(f));
        for (i=1;i<=n;i++) {
            if (l[i]==0&&cupleaza(i)) {
                ok=1;
            }
        }
    }
    fout<<sol<<"\n";
    for (i=1;i<=n;i++) {
        if (l[i]) fout<<i<<" "<<l[i]<<"\n";
    }
    return 0;
}