Cod sursa(job #1363687)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 27 februarie 2015 10:01:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 10000 + 1;

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

int N, M, E;

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

    use[nod] = 1;

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

    return 0;
}

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

    ios_base::sync_with_stdio(false);

    in >> N >> M >> E;

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

    int good = 1;

    while ( good )
    {
        good = 0;
        fill(use + 1, use + N + 1, 0);

        for ( int i = 1; i <= N; ++i )
            if ( st[i] == 0 )
                good |= pairUp(i);
    }

    int match = 0;

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

    out << match << "\n";

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

    return 0;
}