Cod sursa(job #1550516)

Utilizator bogdanRUSURusu Bogdan bogdanRUSU Data 13 decembrie 2015 20:24:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
unsigned N1, N2, M;
vector < vector <unsigned> > graph;
vector <bool> viz;
vector <unsigned> C;

void inPut()
{
    unsigned x, y;
    fin >> N1 >> N2 >> M;
    graph.resize( N1 + N2 + 1 );
    for ( unsigned i = 1; i <= M; ++i )
    {
        fin >> x >> y;
        graph[x].push_back( y );
        graph[ N1 + y ].push_back( x );
    }
}

void outPut ()
{
    unsigned i;
    for ( i = 1; i <= N1; ++i )
    {
        if ( C[i] != 0 )
        {
            if ( C[i] > N1 )
            {
                fout << i << " " << C[i] - N1 << '\n';
                continue;
            }
            fout << i << " " << C[i] << '\n';
        }
    }
}


void init ( bool Init )
{
    unsigned i;
    for ( i = 0; i <= viz.size(); ++i )
        viz[i] = Init;
}


bool dfs ( int x )
{
    viz[x] = true;
    unsigned j;
    for ( j = 0; j < graph[x].size(); ++j )
    {
        int k = graph[x][j] + N1;
        if ( viz[k] || C[x] == k )
        {
            viz[k] = true;
            continue;
        }
        if ( C[k] == 0 )
        {
            viz[k] = true;
            C[k] = x;
            C[x] = k;
            return 1;
        }
        else
        {
            viz[k] = 1;
            if ( dfs( C[k] ) )
            {
                C[x] = k;
                C[k] = x;
                return 1;
            }
            else
                continue;
        }
    }
    return 0;
}
int main()
{
    inPut();
    viz.resize( N1 + N2 + 1, false );
    C.resize( N1 + N2 + 1 );
    unsigned i, ans = 0;
    bool ok = true;
    while ( ok )
    {
        ok = false;
        init( false );
        for ( i = 1; i <= N1; ++i )
            if ( viz[i] == false && C[i] == 0 )
                 if ( dfs( i ) )
                    ok = true;
    }
    for ( i = 1; i <= N1; ++i )
        if ( C[i] > 0 )
            ++ans;
    fout << ans << '\n';
    outPut();
    return 0;
}