Cod sursa(job #2694707)

Utilizator raluca1234Tudor Raluca raluca1234 Data 10 ianuarie 2021 15:47:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
// ia - Cuplaj maxim in graf bipartit
#include <fstream>
#include <vector>

using namespace std;

const int MAX_N = 1e4 + 5;

int n, m, e, l[MAX_N], r[MAX_N], matched;

vector<int> graph[MAX_N];
bool visited[MAX_N];

bool dfs(int node) {
    if (visited[node]) {
        return false;
    }

    visited[node] = 1;
    for (int nei : graph[node]) {
        if (!r[nei] || dfs(r[nei])) {
            l[node] = nei;
            r[nei] = node;
            return true;
        }
    }

    return false;
}

int main() {
    ifstream cin("cuplaj.in");
    ofstream cout("cuplaj.out");

    cin >> n >> m >> e;

    while (e--) {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
    }

    bool found_pair = true;
    while (found_pair) {
        found_pair = false;
        for (int i = 1; i <= n; ++i) {
            visited[i] = 0;
        }

        for (int i = 1; i <= n; ++i) {
            if (!l[i] && dfs(i)) {
                found_pair = true;
                matched++;
            }
        }
    }

    cout << matched << '\n';

    for (int i = 1; i <= n; ++i) {
        if (l[i]) {
            cout << i << ' ' << l[i] << '\n';
        }
    }

    return 0;
}