Cod sursa(job #2635604)

Utilizator irimia_alexIrimia Alex irimia_alex Data 14 iulie 2020 23:38:04
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 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 };
bool viz[NMAX] = { 0 };
int match[NMAX] = { 0 };

bool dfs(int u) {
	for (int v = 1;v <= n;++v) {
		if (!viz[v] && g[u][v] > 0) {
			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) {
		for (int j = 1;j <= n + m;++j)
			viz[j] = false;
		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() {
	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;
		g[y + n][x] = 1;
	}

	maximumMatching();

	return 0;
}