Pagini recente » Cod sursa (job #2096416) | Cod sursa (job #2417251) | Cod sursa (job #1508403) | Cod sursa (job #2627722) | Cod sursa (job #2635602)
#include <stdio.h>
#include <utility>
#include <queue>
#define NMAX 20005
using namespace std;
FILE* fin, * fout;
int n, m, e;
int g[NMAX][NMAX] = { 0 };
int left[NMAX], right[NMAX];
int p[NMAX];
bool bfs(int V,int s, int t) {
p[s] = -1;
int viz[NMAX] = { 0 };
queue<int> q;
q.push(s);
viz[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
for(int v=0;v<=V;++v)
if (!viz[v] && g[u][v] > 0) {
q.push(v);
p[v] = u;
viz[v] = 1;
}
}
return (viz[t] == 1);
}
void cuplajMaxim() {
int s = 0, t = n + m + 1;
for (int i = 0;i < e;++i) {
g[s][left[i]] = 1;
g[left[i]][right[i]] = 1;
g[right[i]][t] = 1;
}
int max_flow = 0;
pair<int, int> edges[NMAX];
while (bfs(n + m + 1, s, t)) {
for (int v = t;v != s;v = p[v]) {
int u = p[v];
g[u][v] -= 1;
g[v][u] += 1;
}
max_flow += 1;
}
fprintf(fout,"%i\n", max_flow);
}
int main() {
fin = fopen("cuplaj.in", "r");
fout = fopen("cuplaj.out", "w");
fscanf(fin, "%i %i %i", &n, &m, &e);
for (int i = 0;i < e;++i) {
int x, y;
fscanf(fin, "%i %i", &x, &y);
left[i] = x;
right[i] = n + y;
}
cuplajMaxim();
return 0;
}