Cod sursa(job #1464384)

Utilizator CollermanAndrei Amariei Collerman Data 23 iulie 2015 12:25:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <bitset>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int NMAX = 10005;

bool schimbat;
int n, p, nr;
int S[NMAX], D[NMAX];
bitset<NMAX> Viz;
vector<int> Graf[NMAX];

bool pair_up(int nod)
{
    if(Viz[nod]) return false;
    Viz[nod] = true;

    for(auto x : Graf[nod])
        if(!D[x]) {
            S[nod] = x, D[x] = nod;
            return true;
        }

    for(auto x : Graf[nod])
        if(pair_up(D[x])) {
            S[nod] = x, D[x] = nod;
            return true;
        }

    return false;
}

int main()
{
    int x, y;

    fin >> n >> p >> p;
    for(int i=1; i<=p; i++) {
        fin >> x >> y;
        Graf[x].push_back(y);
    }

    do {
        schimbat = false;
        Viz.reset();

        for(int i=1; i<=n; i++)
            if(!S[i] && pair_up(i))
                schimbat = true;
    } while(schimbat);

    for(int i=1; i<=n; i++) nr += !!S[i];
    fout << nr << '\n';

    for(int i=1; i<=n; i++)
        if(S[i]) fout << i << ' ' << S[i] << '\n';
    return 0;
}