Cod sursa(job #2932112)

Utilizator trifangrobertRobert Trifan trifangrobert Data 1 noiembrie 2022 21:52:53
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 10000;
int N, M, E;
vector <vector<int>> graph;
vector <bool> seen;
vector <int> lft, rgt;

bool mbm(int node) {
    if (seen[node]) {
        return false;
    }
    seen[node] = true;
    for (auto& x : graph[node]) {
        if (lft[x] == -1) {
            lft[x] = node;
            rgt[node] = x;
            return true;
        }
    }
    for (auto& x : graph[node]) {
        if (mbm(lft[x])) {
            lft[x] = node;
            rgt[node] = x;
            return true;
        }
    }
    return false;
}

int main() {
    ifstream fin("cuplaj.in");
    ofstream fout("cuplaj.out");
    fin >> N >> M >> E;
    lft = rgt = vector <int>(N + M, -1);
    graph = vector <vector <int>>(N + M, vector <int>());
    seen = vector <bool>(N, false);
    for (int i = 0; i < E; ++i) {
        int u, v;
        fin >> u >> v;
        --u; --v;
        v += N;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    bool ok = true;
    while (ok) {
        ok = false;
        seen = vector <bool>(N, false);
        for (int i = 0; i < N; ++i) {
            if (rgt[i] == -1 && mbm(i)) {
                ok = true;
            }
        }
    }
    vector <pair <int, int>> answer;
    for (int i = 0; i < N; ++i) {
        if (rgt[i] != -1) {
            answer.push_back({ i + 1, rgt[i] - N + 1 });
        }
    }
    fout << answer.size() << "\n";
    for (auto& i : answer) {
        fout << i.first << " " << i.second << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}