Cod sursa(job #2695983)

Utilizator SirbuSirbu Ioan Sirbu Data 15 ianuarie 2021 00:25:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>
#define NMAX 10002

using namespace std;


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

int N, M, E;

vector <int> g[NMAX + 2];
bool d[NMAX + 2];
int l[NMAX + 2], r[NMAX + 2];

int matches;
bool PairUp(int node){

    if(d[node])
        return false;


    d[node] = true;
    for(auto it : g[node])
        if(!r[it]) {
            ++matches;
            l[node] = it;
            r[it] = node;
            return true;
        }

    for(auto it : g[node])
        if(PairUp(r[it])) {
                l[node] = it;
                r[it] = node;
                return true;
            }

    return false;

}


void Solve() {

    bool ok;
    do {
        ok = false;

        for(int i = 1; i <= N; i++)
            d[i] = false;

        for(int i = 1; i <= N; i++)
            if(!l[i])
                ok |= PairUp(i);
    }

    while(ok);
}



int main() {

    fin >> N >> M >> E;

    for(int i = 1; i <= E; i++) {

            int x, y;
            fin >> x >> y;
            g[x].push_back(y);
    }

    Solve();
    fout << matches << '\n';

    for(int i = 1; i <= N; i++)
        if(l[i])
            fout << i << ' ' << l[i] << '\n';

    return 0;
}