Cod sursa(job #1006025)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 6 octombrie 2013 09:17:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

const int NMAX = 10003;

vector <int> G[NMAX];
bitset <NMAX> paired;
int left[NMAX], right[NMAX];

bool pairup (const int &node) {

    if (paired[node])
        return 0;
    vector <int> :: iterator i;
    paired[node] = 1;
    for (i = G[node].begin (); i != G[node].end (); ++i)
        if (!right[*i]) {
            left[node] = *i;
            right[*i] = node;
            return 1;
        }
    for (i = G[node].begin (); i != G[node].end (); ++i)
        if (pairup (right[*i])) {
            left[node] = *i;
            right[*i] = node;
            return 1;
        }
    return 0;

}

int main () {

    freopen ("cuplaj.in", "r", stdin);
    freopen ("cuplaj.out", "w", stdout);
    int N, M, E, i, a, b, r = 0;
    bool change = 1;
    scanf ("%d%d%d", &N, &M, &E);
    for (i = 1; i <= E; ++i)
        scanf ("%d%d", &a, &b),
        G[a].push_back (b);
    while (change) {
        change = 0;
        paired.reset ();
        for (i = 1; i <= N; ++i)
            if (!left[i])
                if (pairup (i))
                    change = 1;
    }
    for (i = 1; i <= N; ++i)
        if (left[i])
            ++r;
    printf ("%d", r);
    for (i = 1; i <= N; ++i)
        if (left[i])
            printf ("\n%d %d", i, left[i]);

}