Cod sursa(job #1985431)

Utilizator rares96cheseliRares Cheseli rares96cheseli Data 27 mai 2017 21:31:11
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>

#define NMAX 100005

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int N, M, x, y, paired, st[NMAX], dr[NMAX], ok = 1, edges;
vector < int > G[NMAX];
bitset < NMAX > viz;

int pair_up(int node) {
    if (viz[node]) {
        return 0;
    }

    viz[node] = 1;
    for (auto it : G[node]) {
        if (!dr[it]) {
            dr[it] = node;
            st[node] = it;
            return 1;
        }
    }

    for (auto it : G[node]) {
        if (dr[it] && pair_up(dr[it])) {
            dr[it] = node;
            st[node] = it;
            return 1;
        }
    }

    return 0;
}

int main() {
    f >> N >> M >> edges;
    for (int i = 1; i <= edges; ++i) {
        f >> x >> y;
        G[x].push_back(y);
    }

    while (ok) {
        ok = 0; viz.reset();

        for (int i = 1; i <= N; ++i) {
            if (!st[i] && pair_up(i)) {
                ++paired;
                ok = 1;
            }
        }
    }

    g << paired << '\n';
    for (int i = 1; i <= N; ++i) {
        if (st[i]) {
            g << i << ' ' << st[i] << '\n';
        }
    }
    return 0;
}