Cod sursa(job #985051)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 16 august 2013 12:28:19
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

#define Nmax 10005

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

int N, M, E, nr;

void read()
{
    ifstream f("cuplaj.in");

    f >> N >> M >> E;

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

        G[a].push_back( b );
    }

    f.close();
}

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

    use[nod] = 1;

    for ( unsigned i = 0; i < G[nod].size(); ++i )
    {
        if ( !dr[ G[nod][i] ] || cupleaza( dr[ G[nod][i] ] ) )
        {
            st[nod] = G[nod][i];
            dr[ G[nod][i] ] = nod;

            return 1;
        }
    }

    return 0;
}

void cuplaj()
{
    for ( int i = 1; i <= N; ++i )
    {
        if ( st[i] )
                continue;

        if ( cupleaza( i ) )
                nr++;
        else
        {
            fill( use, use + Nmax, 0 );

            if ( cupleaza( i ) )
                    nr++;
        }
    }
}

void print()
{
    ofstream g("cuplaj.out");

    g << nr << '\n';

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

    g.close();
}

int main()
{
    read();
    cuplaj();
    print();

    return 0;
}