Cod sursa(job #2802110)

Utilizator Tudor06MusatTudor Tudor06 Data 17 noiembrie 2021 16:16:42
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 1e5;

vector <int> edges[2 * NMAX + 1];
int viz[2 * NMAX + 1];
int pereche[2 * NMAX + 1];

bool reimperechere( int node ) {
    viz[node] = 1;
    for ( auto it : edges[node] ) {
        int x = pereche[it];
        if ( x == 0 ) {
            pereche[node] = it;
            pereche[it] = node;
            return 1;
        }
        if ( !viz[x] && reimperechere( x ) ) {
            pereche[node] = it;
            pereche[it] = node;
            return 1;
        }
    }
    return 0;
}
int main() {
    ifstream fin( "cuplaj.in" );
    ofstream fout( "cuplaj.out" );
    int n, m, e, i;
    fin >> n >> m >> e;
    for ( i = 0; i < e; i ++ ) {
        int a, b;
        cin >> a >> b;
        edges[a].push_back( b + n );
        edges[b + n].push_back( a );
    }
    int cuplaj = 0, sepoate = 1;
    while ( sepoate ) {
        sepoate = 0;
        for ( i = 1; i <= n + m; i ++ ) {
            viz[i] = 0;
        }
        for ( i = 1; i <= n; i ++ ) {
            if ( !viz[i] && !pereche[i] && reimperechere( i ) ) {
                sepoate = 1;
                cuplaj ++;
            }
        }
    }
    fout << cuplaj << '\n';
    for ( i = 1; i <= n; i ++ ) {
        if ( pereche[i] ) {
            fout << i << ' ' << pereche[i] - n << '\n';
        }

    }
    return 0;
}