Cod sursa(job #3156584)

Utilizator Tudor06MusatTudor Tudor06 Data 11 octombrie 2023 19:59:22
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 10000;
const int VMAX = 2 * NMAX;

vector <int> edges[VMAX + 1];
int p[VMAX + 1];
bool viz[VMAX + 1];

bool repair( int node ) {
    if ( viz[node] ) return false;
    viz[node] = true;
    for ( auto vec : edges[node] ) {
        if ( !viz[vec] && ( !p[vec] || repair( p[vec] ) ) ) {
            p[node] = vec;
            p[vec] = node;
            return true;
        }
    }
    return false;
}

int main() {
    ifstream fin( "test.in" );
    ofstream fout( "test.out" );
    int n, m, e;
    fin >> n >> m >> e;
    for ( int i = 0, a, b; i < e; i ++ ) {
        fin >> a >> b;
        edges[a].push_back( b + n );
        edges[b + n].push_back( a );
    }

    int cuplaj = 0;
    for ( int i = 1; i <= n; i ++ ) {
        for ( auto vec : edges[i] ) {
            if ( !p[vec] ) {
                p[i] = vec;
                p[vec] = i;
                cuplaj ++;
                break;
            }
        }
    }

    bool sepoate = true;
    while ( sepoate ) {
        sepoate = false;
        for ( int i = 1; i <= n; i ++ ) viz[i] = false;
        for ( int i = 1; i <= n; i ++ ) {
            if ( !viz[i] && !p[i] && repair( i ) ) {
                cuplaj ++;
                sepoate = true;
            }
        }
    }
    fout << cuplaj << '\n';
    for ( int i = 1; i <= n; i ++ ) {
        if ( p[i] ) {
            fout << i << ' ' << p[i] - n << '\n';
        }
    }
    return 0;
}