Cod sursa(job #1936314)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 22 martie 2017 23:43:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");

const int NMAX = 1e5 + 5;

int ant, n, m, k;

vector<int> g[NMAX];
int l[NMAX], r[NMAX];
bool f[NMAX];

bool match(int u) {
    if (f[u]) return false;
    f[u] = true;

    for (auto v: g[u]) if (!r[v]) {
        l[u] = v;
        r[v] = u;
        return true; }

    for (auto v: g[u]) if (!f[r[v]] && match(r[v])) {
        l[u] = v;
        r[v] = u;
        return true; }

    return false; }

int main() {
    bool flag;
    int a, b;

    fi >> n >> m >> k;
    for (int i = 1; i <= k; ++i) {
        fi >> a >> b;
        g[a].push_back(b); }

    do {
        memset(f, 0x00, sizeof f);
        flag = false;

        for (int i = 1; i <= n; ++i)
            if (!l[i] && match(i))
                flag = true,
                ++ant; }
    while (flag);

    fo << ant << '\n';
    for (int i = 1; i <= n; ++i)
        if (l[i] != 0)
            fo << i << ' ' << l[i] << '\n';

    return 0; }