Pagini recente » Cod sursa (job #1320517) | Cod sursa (job #70117) | Cod sursa (job #150378) | Cod sursa (job #2142033) | Cod sursa (job #2635609)
#include <stdio.h>
#include <queue>
#define NMAX 20005
using namespace std;
FILE* fin, * fout;
int n, m, e;
int g[NMAX][NMAX] = { 0 };
bool viz[NMAX] = { 0 };
int match[NMAX] = { 0 };
int parent[NMAX];
bool bfs(int s, int t) {
for (int i = 0;i <= n + m + 1;++i)
viz[i] = false;
queue<int> q;
q.push(s);
viz[s] = true;
parent[s] = -1;
while (!q.empty()) {
int u = q.front();
q.pop();
for(int v=0;v<=n+m+1;++v)
if (!viz[v] && g[u][v] > 0) {
q.push(v);
viz[v] = true;
parent[v] = u;
}
}
return (viz[t] == true);
}
void maximumMatching() {
int s = 0, t = n + m + 1;
for (int i = 1;i <= n;++i)
g[s][i] = 1;
for (int i = n + 1;i <= n + m;++i)
g[i][t] = 1;
int max_flow = 0;
while (bfs(s, t)) {
for (int v = t;v != s;v = parent[v]) {
int u = parent[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);
while (e--) {
int x, y;
fscanf(fin, "%i %i", &x, &y);
g[x][y + n] = 1;
}
maximumMatching();
return 0;
}