Cod sursa(job #3300671)

Utilizator _andr31Rusanescu Andrei-Marian _andr31 Data 18 iunie 2025 15:32:18
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>
using namespace std;

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

    int n, m, e;
    fin >> n >> m >> e;

    int old_n = n;
    n += m;

    vector<vector<int>> adj(n + 2);
    vector<vector<int>> c(n + 2, vector<int>(n + 2));

    for (int i = 1, u, v; i <= e; ++i) {
        fin >> u >> v;
        v += old_n;
        adj[u].push_back(v);
        adj[v].push_back(u);

        c[u][v] = 1;
    }

    int s = 0, t = n + 1;
    for (int i = 1; i <= old_n; ++i) {
        adj[s].push_back(i);
        adj[i].push_back(s);
        c[s][i] = 1;
    }
    for (int i = old_n + 1; i <= n; ++i) {
        adj[i].push_back(t);
        adj[t].push_back(i);
        c[i][t] = 1;
    }

    vector<int> parent(n + 2);

    function<int()> bfs = [&]() -> int {
        fill(parent.begin(), parent.end(), -1);
        parent[s] = -2;
        queue<pair<int, int>> q;
        int curr = 2;
        q.emplace(s, curr);

        while (!q.empty()) {
            auto [u, curr] = q.front(); q.pop();

            for (int v : adj[u]) {
                if (parent[v] == -1 && c[u][v]) {
                    int new_f = min(curr, c[u][v]);
                    parent[v] = u;
                    if (v == t)
                        return new_f;
                    q.emplace(v, new_f);
                }
            }
        }
        return 0;
    };

    int flow = 0, newf;
    while (newf = bfs()) {
        flow += newf;
        int nod = t;
        while (nod != s) {
            int prev = parent[nod];
            c[prev][nod] -= newf;
            c[nod][prev] += newf;
            nod = prev;
        }
    }

    fout << flow << '\n';

    for (int i = 1; i <= old_n; ++i) {
        for (int j = old_n + 1; j <= n; ++j) {
            if (c[j][i] != 0) {
                fout << i << ' ' << j - old_n << '\n';
            }
        }
    }

    return 0;
}