Cod sursa(job #2894127)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 27 aprilie 2022 13:29:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

const int MAX_N = 20001;

vector<int> edges[MAX_N];
int p[MAX_N];
bool viz[MAX_N];

int n, m, e;

bool dfs(int u) {
    viz[u] = 1;

    for (int v : edges[u])
        if (!p[v]) {
            p[v] = u;
            p[u] = v;
            return 1;
        }

    for (int v : edges[u]) {
        if (viz[v]) continue;

        viz[v] = 1;
        if (dfs(p[v])) {
            p[v] = u;
            p[u] = v;
            return 1;
        }
    }

    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);

    cin >> n >> m >> e;

    for (int i = 0; i < e; i++) {
        int a, b;
        cin >> a >> b;
        b += n;

        edges[a].push_back(b);
        edges[b].push_back(a);
    }

    int cnt = 0;
    bool g = true;
    while (g) {
        for (int i = 1; i <= n + m; i++)
            viz[i] = 0;

        g = 0;
        for (int i = 1; i <= n; i++) {
            if (viz[i] || p[i])
                continue;
            if (dfs(i)) {
                g = 1;
                cnt++;
            }
        }
    }

    cout << cnt << '\n';
    for (int i = 1; i <= n; i++)
        if (p[i])
            cout << i << ' ' << p[i] - n << '\n';

    return 0;
}