Cod sursa(job #2635610)

Utilizator irimia_alexIrimia Alex irimia_alex Data 15 iulie 2020 00:10:06
Problema Cuplaj maxim in graf bipartit Scor 12
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#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();
		if (u == t)
			return true;
		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 false;
}

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;
}