Cod sursa(job #568138)

Utilizator nandoLicker Nandor nando Data 30 martie 2011 20:44:18
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;

int n, m, e;

#define MAXN 10005

vector <int> g [MAXN];
bitset <MAXN> viz;

int p[MAXN], r[MAXN];

typedef vector <int>::iterator iter;

fstream fin ("cuplaj.in", ios::in);
fstream fout ("cuplaj.out", ios::out);

bool match (int i)
{
    if (viz[i])
        return false;
    viz[i] = true;

    for (iter it = g[i].begin (); it != g[i].end (); ++it) {
        if (!r[*it]) {
            p[i] = *it;
            r[*it] = i;
            return true;
        }
    }

    for (iter it = g[i].begin (); it != g[i].end (); ++it) {
        if (match (r [*it])) {
            p[i] = *it;
            r[*it] = i;
            return true;
        }
    }
    return false;
}

int main ()
{
    fin >> n >> m >> e;

    for (int i = 0, x, y; i < e; ++i) {
        fin >> x >> y;
        g[x].push_back (y);
    }

    bool ok = true;
    while (ok) {
        ok = false;
        viz.reset ();

        for (int i = 1; i <= n; ++i) {
            if (!p[i])
                ok |= match (i);
        }
    }

    int num = 0;
    for (int i = 1; i <= n; ++i)
        if (p[i])
            ++num;

    fout << num << endl;
    for (int i = 1; i <= n; ++i)
        if (p[i])
            fout << i << " " << p[i] << endl;


    fin.close ();
    fout.close ();
    return 0;
}