Cod sursa(job #2635935)

Utilizator irimia_alexIrimia Alex irimia_alex Data 15 iulie 2020 23:38:00
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 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) {
	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;
}