Cod sursa(job #3289687)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 28 martie 2025 09:21:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
vector <int> l[10005], r[10005];
int cupl[10005], cupr[10005];
bool viz[10005];

bool cupleaza (int nod)
{
    if (viz[nod]) return 0;
    viz[nod]=1;
    for (int vecin : l[nod]) {
        if (cupr[vecin]==0) {
            cupr[vecin]=nod;
            cupl[nod] = vecin;
            return 1;
        }
        else {
            bool ans = cupleaza(cupr[vecin]);
            if (ans) {
                cupr[vecin]=nod;
                cupl[nod] = vecin;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    fin.tie(0); fin.sync_with_stdio(false);
    int n, m, e; fin>>n>>m>>e;
    for (int i=1; i<=e; i++) {
        int a, b; fin>>a>>b;
        l[a].push_back(b); r[b].push_back(a);
    }
    bool am_cuplat = 0;
    do {
        am_cuplat = 0;
        memset(viz, 0, sizeof(viz));
        for (int i=1; i<=n; i++) {
            if (cupl[i]==0) {
                am_cuplat = am_cuplat | cupleaza(i);
            }
        }
    } while (am_cuplat);
    int cnt = 0;
    for (int i=1; i<=n; i++) {
        if (cupl[i]) cnt++;
    }
    fout<<cnt<<'\n';
    for (int i=1; i<=n; i++) {
        if (cupl[i]) {
            fout<<i<<' '<<cupl[i]<<'\n';
        }
    }
    return 0;
}