Cod sursa(job #1009688)

Utilizator costinbanuCostin Banu costinbanu Data 13 octombrie 2013 17:34:07
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
/**algoritmul EDMONDS-KARP pt. determinarea unui cuplaj maximal cu ajutorul unui flux intr-un graf
bipartit retinut intr-o matrice NxM in care o parte este in linii si cealalta parte in coloane.
complexitate O((N+M)^2)**/

#include <cstdio>
#include <cstring>
using namespace std;

int M, N, E, cup[10002], viz[10002];
bool g[10002][10002];

bool dfs(int u) {
    for (int v = 1; v <= N; v++) {
        if (g[u][v] && !viz[v]) {
            viz[v] = true;
            if (cup[v] < 0 || dfs(cup[v])) {
                cup[v] = u;
                return true;
            }
        }
    }
    return false;
}

int cuplaj() {
    int result = 0;
    memset(cup, -1, sizeof(cup));
    for (int u = 1; u <= M; u++) {
        memset(viz, 0, sizeof(viz));
        if (dfs(u))
            result++;
    }
    return result;
}

int main() {
    FILE *in = fopen("cuplaj.in", "r"), *out = fopen("cuplaj.out", "w");
    if (in && out){
        fscanf(in, "%d %d %d\n", &N, &M, &E);
        for(int i = 0; i < E; i++){
            int x, y;
            fscanf(in, "%d %d", &x, &y);
            g[y][x] = 1;
        }
        fprintf(out, "%d\n", cuplaj());
        for(int i = 1; i <= N; i++)
            if (cup[i] > 0)
                fprintf(out, "%d %d\n", i, cup[i]);
        fclose(in), fclose(out);
    }

    return 0;
}