Cod sursa(job #947773)

Utilizator BitOneSAlexandru BitOne Data 8 mai 2013 14:00:15
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bitset>
#include <vector>
#include <cstdlib>
#include <fstream>

using namespace std;

const int NMAX = 10011;

bitset<NMAX> was;
vector<int> G[NMAX];
int L[NMAX], R[NMAX];
bool VCoverL[NMAX], VCoverR[NMAX];

inline bool pairUp(int x)
{
    if(was[x]) return false;
    was[x] = true;

    for(auto& y : G[x])
    {
        if(!L[y] || pairUp(L[y]))
        {
            L[y] = x;
            R[x] = y;
            return true;
        }
    }
    return false;
}

int main()
{
    bool ok;
    int N, M, E, x, y, size, i;
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");

    for(in >> N >> M >> E; E; --E)
    {
        in >> x >> y;
        G[x].push_back(y);
    }
    size = 0;
    do {
            ok = false;
            for(i = 1; i <= N; ++i)
                if(!R[i] && pairUp(i))
                {
                    ++size;
                    ok = true;
                }
            was.reset();
       }while(ok);

    out << size << '\n';
    for(i = 1; i <= N; ++i)
        if(R[i]) out << i << ' ' << R[i] << '\n';

    return EXIT_SUCCESS;
}