Cod sursa(job #3297319)

Utilizator Arhiva_EducationalaArhiva Educationala Arhiva_Educationala Data 22 mai 2025 14:01:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100000;

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

bool repair( int node ) {
    if ( viz[node] ) return false;
    viz[node] = true;
    for ( auto vec : edges[node] ) {
        if ( !p[vec] || repair( p[vec] ) ) {
            p[node] = vec;
            p[vec] = node;
            return true;
        }
    }
    return false;
}
int main() {
    ifstream fin( "cuplaj.in" );
    ofstream fout( "cuplaj.out" );
    int n, m, e;
    fin >> n >> m >> e;
    for ( int i = 1, a, b; i <= e; i ++ ) {
        fin >> a >> b;
        edges[a].push_back( b + n );
    }

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