Cod sursa(job #301381)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 8 aprilie 2009 10:09:55
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
#include <vector>
#include <string.h>

#define pb push_back

using namespace std;

long n, m, e, a, b, sol, viz[10010], cuplaj[10010], i, ok;
vector<long> G[10010];

long cupleaza(long nod) {
    if (viz[nod]) {
        return 0;
    }
    viz[nod] = 1;
    for (vector<long>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
        if (!cuplaj[*it]) {
            cuplaj[*it] = nod;
            return 1;
        } else {
            if (cuplaj[*it] != nod && cupleaza(cuplaj[*it])) {
                cuplaj[*it] = nod;
                return 1;
            }
        }
    }
    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    scanf("%ld %ld %ld", &n, &m, &e);
    for (i = 1; i <= e; ++i) {
        scanf("%ld %ld", &a, &b);
        G[a].pb(b);
    }
    ok = 1;
    while (ok) {
        ok = 0;
        memset(viz, 0, sizeof(viz));
        for (i = 1; i <= n; ++i) {
            if (!cuplaj[i] && cupleaza(i)) {
                cuplaj[i] = 1;
                ++sol;
                ok = 1;
            }
        }
    }
    printf("%ld\n", sol);
    for (i = 1; i <= m; ++i) {
        if (cuplaj[i]) {
            printf("%ld %ld\n", cuplaj[i], i);
        }
    }
    return 0;
}