Cod sursa(job #301392)

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

#define pb push_back

using namespace std;

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

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;
        }
    }
    for (vector<long>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
        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);
    }
    for (i = 1; i <= n; ++i) {
        memset(viz, 0, sizeof(viz));
        sol += cupleaza(i);
    }
    printf("%ld\n", sol);
    for (i = 1; i <= m; ++i) {
        if (cuplaj[i]) {
            printf("%ld %ld\n", cuplaj[i], i);
        }
    }
    return 0;
}