Pagini recente » Cod sursa (job #1878692) | Cod sursa (job #424145) | Cod sursa (job #2334293) | Cod sursa (job #1692687) | Cod sursa (job #1009688)
/**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;
}