Cod sursa(job #3236563)

Utilizator Ana_22Ana Petcu Ana_22 Data 29 iunie 2024 12:27:59
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100001

using namespace std;

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

vector <int> edges[NMAX];
int l, r;
int pr[NMAX], pr2[NMAX], viz[NMAX];

int match( int node ) {
    if( viz[node] )
        return 0;
    viz[node] = 1;
    int g = 0;
    for( unsigned int i = 0; i < edges[node].size() && g == 0; i++ ) {
        int newnode = edges[node][i];
        if( pr2[newnode] == 0 ) {
            pr[node] = newnode;
            pr2[newnode] = node;
            g = 1;
        }
    }
    for( unsigned int i = 0; i < edges[node].size() && g == 0; i++ ) {
        int newnode = edges[node][i];
        if( match( pr2[newnode] ) ) {
            pr[node] = newnode;
            pr2[newnode] = node;
            g = 1;
        }
    }
    return g;
}

void cuplaj() {
    int g = 1;
    while( g ) {
        g = 0;
        for( int i = 1; i <= l; i++ )
            if( pr[i] == 0 )
                g = g + match( i );
        for( int i = 1; i <= l; i++ ) viz[i] = 0;
    }
}

int main() {
    int x, y, m;
    fin >> l >> r >> m;
    for( int i = 0; i < m; i++ ) {
        fin >> x >> y;
        y += l;
        edges[x].push_back( y );
//        edges[y].push_back( x );
    }
    cuplaj();
    int cnt = 0;
    for( int i = 1; i <= l; i++ ) {
        if( pr[i] != 0 )
            cnt++;
    }
    fout << cnt << '\n';
    for( int i = 1; i <= l; i++ ) {
        if( pr[i] != 0 )
            fout << i << ' ' << pr[i] - l << '\n';
    }
    return 0;
}