Cod sursa(job #2635602)

Utilizator irimia_alexIrimia Alex irimia_alex Data 14 iulie 2020 23:20:27
Problema Cuplaj maxim in graf bipartit Scor 12
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#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;
}