Cod sursa(job #568141)

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

short n, m;

#define MAXN 10005

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

short p[MAXN], r[MAXN];

typedef vector <short>::iterator iter;

FILE* fin = fopen ("cuplaj.in", "r");
FILE* fout = fopen ("cuplaj.out", "w");

bool match (short 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 ()
{
    int e;
    fscanf (fin, "%hd %hd %d\n", &n, &m, &e);

    short x, y;
    for (int i = 0; i < e; ++i) {
        fscanf (fin, "%hd %hd\n", &x, &y);
        g[x].push_back (y);
    }


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

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

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

    fprintf (fout, "%d\n", num);
    for (short i = 1; i <= n; ++i)
        if (p[i])
            fprintf (fout, "%hd %hd\n", i, p[i]);


    fclose (fin);
    fclose (fout);
    return 0;
}