Cod sursa(job #1268384)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 20 noiembrie 2014 21:41:14
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 1e4 + 2;

vector <int> G[Nmax];
int st[Nmax], dr[Nmax];
int use[Nmax];

int N, M, E;

int pairup( int nod )
{
    if ( use[nod] )
        return 0;

    use[nod] = 1;

    for ( auto x: G[nod] )
        if ( !dr[x] || pairup( dr[x] ) )
        {
            st[nod] = x;
            dr[x] = nod;
            return 1;
        }

    return 0;
}

void cuplaj()
{
    int valid = 1;

    do
    {
        valid = 0;
        memset( use, 0, sizeof( use ) );

        for ( int i = 1; i <= N; ++i )
            if ( !st[i] )
                valid |= pairup( i );

    } while ( valid );

    int nr = 0;

    for ( int i = 1; i <= N; ++i )
        nr += ( st[i] > 0 );

    ofstream out("cuplaj.out");

    out << nr << "\n";

    for ( int i = 1; i <= N; ++i )
        if ( st[i] )
            out << i << " " << st[i] << "\n";
}

int main()
{
    ifstream in("cuplaj.in");

    in >> N >> M >> E;

    for ( int i = 1, a, b; i <= E; ++i )
    {
        in >> a >> b;

        G[a].push_back( b );
    }

    cuplaj();

    return 0;
}