Cod sursa(job #3357993)

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

const int NMAX = 1e4 + 5;

int n, m, e, d[NMAX], match[NMAX], dist[NMAX];
vector<int> g[NMAX];
queue<int> q;

bool bfs() {
    for (int i = 1; i <= n; i++) {
        if (!match[i]) {
            dist[i] = 0;
            q.push(i);
        } else {
            dist[i] = NMAX;
        }
    }
    dist[0] = NMAX;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        if (dist[u] < dist[0]) {
            for (int v : g[u]) {
                if (dist[match[v]] == NMAX) {
                    dist[match[v]] = dist[u] + 1;
                    q.push(match[v]);
                }
            }
        }
    }
    return dist[0] != NMAX;
}

bool dfs(int u) {
    if (u != 0) {
        for (int v : g[u]) {
            if (dist[match[v]] == dist[u] + 1 && dfs(match[v])) {
                match[u] = v;
                match[v] = u;
                return true;
            }
        }
        dist[u] = NMAX;
        return false;
    }
    return true;
}

int main() {
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin >> n >> m >> e;
    for (int i = 1; i <= e; i++) {
        int u, v;
        fin >> u >> v;
        g[u].push_back(v + n);
    }
    int ans = 0;
    while (bfs()) {
        for (int i = 1; i <= n; i++) {
            if (!match[i] && dfs(i)) {
                ans++;
            }
        }
    }
    fout << ans << '\n';
    for (int i = 1; i <= n; i++) {
        if (match[i]) {
            fout << i << ' ' << match[i] - n << '\n';
        }
    }
    return 0;
}