Cod sursa(job #2695994)

Utilizator killerdonuttudor nicolae killerdonut Data 15 ianuarie 2021 00:48:27
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb

#include <fstream>
#include <vector>
#include <string.h>

using namespace std;

ifstream fin("cuplaj.in");
ofstream out("cuplaj.out");

const int MAXN = 1e4;
const int MAXM = 1e4;
const int MAXE = 1e5;

int n, m, e;
vector<int> g[MAXN + 1];
bool viz[MAXN + 1];
int cup_le[MAXN + 1], cup_ri[MAXN + 1];

bool cuplaj(int nod) {
    if (viz[nod]) return false;
    viz[nod] = true;

    for (auto x : g[nod]) {
        if (cup_le[x] == 0) {
            cup_le[x] = nod;
            cup_ri[nod] = x;
            return true;
        }
    }

    for (auto x : g[nod]) {
        if (cuplaj(cup_le[x])) {
            cup_le[x] = nod;
            cup_ri[nod] = x;
            return true;
        }
    }



    return false;
}

int main() {
    fin >> n >> m >> e;

    for (int i = 1; i <= e; ++ i) {
        int a, b;
        fin >> a >> b;
        g[a].push_back(b);
    }

    bool ok = true;

    while (ok) {
        ok = false;
        memset(viz, 0, sizeof(viz));

        for (int i = 1; i <= n; ++ i) {
            if (!cup_ri[i]) {
                ok |= cuplaj(i);
            }
        }
    }

    int cnt = 0;
    for (int i = 1; i <= n; ++ i) {
        if (cup_ri[i])
            ++ cnt;
    }

    fout << cnt << '\n';
    for (int i = 1; i <= n; ++ i) {
        if (cup_ri[i]) {
            fout << i << ' ' << cup_ri[i] << '\n';
        }
    }

    return 0;
}