Cod sursa(job #3358015)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 22:58:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

const int NMAX = 10005;

int n, m, e;
vector<int> g[NMAX];
int l[NMAX], r[NMAX], dist[NMAX];

bool bfs() {
    queue<int> q;
    for (int u = 1; u <= n; ++u) {
        if (l[u] == 0) {
            dist[u] = 0;
            q.push(u);
        } else {
            dist[u] = -1;
        }
    }
    bool ok = false;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int v : g[u]) {
            if (r[v] == 0) {
                ok = true;
            } else if (dist[r[v]] == -1) {
                dist[r[v]] = dist[u] + 1;
                q.push(r[v]);
            }
        }
    }
    return ok;
}

bool dfs(int u) {
    for (int v : g[u]) {
        if (r[v] == 0 || (dist[r[v]] == dist[u] + 1 && dfs(r[v]))) {
            l[u] = v;
            r[v] = u;
            return true;
        }
    }
    dist[u] = -1;
    return false;
}

int hopcroft_karp() {
    int flow = 0;
    while (bfs()) {
        for (int u = 1; u <= n; ++u) {
            if (l[u] == 0 && dfs(u)) {
                ++flow;
            }
        }
    }
    return flow;
}

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

    fin >> n >> m >> e;
    for (int i = 0; i < e; ++i) {
        int u, v;
        fin >> u >> v;
        g[u].push_back(v);
    }

    int sol = hopcroft_karp();
    fout << sol << '\n';
    for (int u = 1; u <= n; ++u) {
        if (l[u] != 0) {
            fout << u << ' ' << l[u] << '\n';
        }
    }

    fin.close();
    fout.close();
    return 0;
}