Cod sursa(job #2134687)

Utilizator adiXMGemene Adrian adiXM Data 18 februarie 2018 11:19:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int nMax = 10005;
int St[nMax], Dr[nMax];
///st - cuplez i cu B
///dr - cuplez i cu A
vector <int> G[nMax];
int viz[nMax]; ///daca nodul i din stanga este cuplat
inline int Cupleaza(int k) {
    if(viz[k] == 1) {
        return false;
    }
    viz[k] = 1;
    for(const auto& v : G[k]) {
        if(Dr[v] == 0) {
            St[k] = v;
            Dr[v] = k;
            return true;
        }
    }
    for(const auto& v : G[k]) {
        if(Cupleaza(Dr[v])) {
            St[k] = v;
            Dr[v] = k;
            return true;
        }
    }
    return false;
}
inline int Solve(int n) {
    int ok = false;
    int lng = 0;
    while(!ok) {
        ok = true;
        for(int i = 1; i <= n; i++) {
            viz[i] = 0;
        }
        for(int i = 1; i <= n; i++) {
            if(St[i] == 0 && Cupleaza(i)) {
                lng++;
                ok = false;
            }
        }
    }
    return lng;
}
int main()
{
    int n, m, e, ans = 0, x, y;
    f >> n >> m >> e;
    for(int i = 1; i <= e; i++) {
        f >> x >> y;
        G[x].push_back(y);
    }
    ans = Solve(n);
    g << ans << "\n";
    for(int i = 1; i <= n; i++) {
        if(St[i] != 0) {
            g << i << " " << St[i] << "\n";
        }
    }
    return 0;
}