Cod sursa(job #3195364)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 20 ianuarie 2024 16:58:10
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int N = 10010;

vector <int> g[N];

int l[N], r[N];
bool viz[N];

int PairUp ( int n ) {
    
    if ( viz[n] != 0 )
        return 0;
    
    viz[n] = 1;
    
    for ( int i = 0; i < g[n].size(); i++ ) {
        if ( r[g[n][i]] == 0 ) {
            l[n] = g[n][i];
            r[g[n][i]] = n;
            return 1;
        }
    }
    
    for ( int i = 0; i < g[n].size(); i++ ) {
        if ( PairUp ( r[g[n][i]] ) != 0 ) {
            l[n] = g[n][i];
            r[g[n][i]] = n;
            return 1;
        }
    }
    
    return 0;
}

int main () {
    
    int n1, n2, m, a, b;
    
    fin >> n1 >> n2 >> m;
    
    for ( int i = 0; i < m; i++ ) {
        fin >> a >> b;
        g[a].push_back (b);
    }
    
    int ok = 1;
    
    while ( ok == 1 ) {
        
        ok = 0;
        
        for ( int i = 1; i <= n1; i++ )
            viz[i] = 0;
        
        for ( int i = 1; i <= n1; i++ )
            if ( l[i] == 0 && PairUp(i) == 1 )
                ok = 1;
    }
    
    int cnt = 0;
    
    for ( int i = 1; i <= n1; i++ )
        if ( l[i] != 0 )
            cnt++;
    
    fout << cnt << "\n";
    
    for ( int i = 1; i <= n1; i++ )
        if ( l[i] != 0 )
            fout << i << " " << l[i] << "\n";
    
    return 0;
}