Cod sursa(job #2635932)

Utilizator irimia_alexIrimia Alex irimia_alex Data 15 iulie 2020 23:30:59
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#include <cstring>
#include <utility>
#include <vector>
#include <time.h>
#define NMAX 20005

using namespace std;

FILE* fin, * fout;

int n, m, e;
vector<int> g[NMAX];
bool viz[NMAX] = { 0 };
int match[NMAX] = { 0 };

bool dfs(int u) {
	if (viz[u]) return false;
	for (auto v : g[u]) {
		if (!viz[v]) {
			viz[v] = true;
			if (match[v] == 0 || dfs(match[v])) {
				match[v] = u;
				return true;
			}
		}
	}
	return false;
}

void maximumMatching() {
	int res = 0;
	for (int i = n + 1;i <= n + m;++i) {
		if(!dfs(i))
			memset(viz, 0, sizeof(viz));
		if (dfs(i))
			++res;
	}
	fprintf(fout, "%i\n", res);
	for (int i = 1;i <= n;++i)
		if (match[i] != 0)
			fprintf(fout, "%i %i\n", i, match[i] - n);
}

int main() {
	clock_t t = clock();

	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].push_back(y + n);
		g[y + n].push_back(x);
	}

	maximumMatching();

	printf("%f", (float)(clock() - t) / CLOCKS_PER_SEC);

	return 0;
}