Cod sursa(job #379736)

Utilizator DastasIonescu Vlad Dastas Data 3 ianuarie 2010 16:40:35
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>

using namespace std;

const int maxn = 10001;

void citire(vector<int> G[], int &N, int &M)
{
    int E;

    ifstream in("cuplaj.in");
    in >> N >> M >> E;

    int x, y;
    for ( int i = 1; i <= E; ++i )
    {
        in >> x >> y;
        G[x].push_back(y);
    }

    in.close();
}

bool Cuplare(vector<int> G[], int i, int St[], int Dr[], bool V[])
{
    if ( V[i] )
        return 0;
    V[i] = 1;

    vector<int>::iterator v;
    for ( v = G[i].begin(); v != G[i].end(); ++v )
        if ( !St[*v] )
        {
            St[*v] = i;
            Dr[i] = *v;
            return 1;
        }

    for ( v = G[i].begin(); v != G[i].end(); ++v )
        if ( Cuplare(G, St[*v], St, Dr, V) )
        {
            St[*v] = i;
            Dr[i] = *v;
            return 1;
        }

    return 0;
}

void CuplajMax(vector<int> G[], int N)
{
    int St[maxn], Dr[maxn];
    bool V[maxn], ok = 1;

    for ( int i = 1; i < maxn; ++i )
        St[i] = Dr[i] = 0;

    do
    {
        ok = 0;

        for ( int i = 1; i <= N; ++i )
            V[i] = 0;

        for ( int i = 1; i <= N; ++i )
            if ( !Dr[i] )
                ok |= Cuplare(G, i, St, Dr, V);

    } while ( ok );

    ofstream out("cuplaj.out");
    for ( int i = 1; i <= N; ++i )
        if ( Dr[i] )
            out << i << ' ' << Dr[i] << '\n';

    out.close();
}

int main()
{
    int N, M;
    vector<int> G[maxn];

    citire(G, N, M);
    CuplajMax(G, N);

	return 0;
}