Cod sursa(job #2201620)

Utilizator emiemiEmi Necula emiemi Data 5 mai 2018 12:31:52
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

#define NMAX 10005

int m, n, e;
vector<int> v[NMAX];
int stg[NMAX], dr[NMAX], viz[NMAX];

int adauga(int x) {
	if (viz[x])
		return 0;
	viz[x] = 1;

	int i, len = v[x].size();
	for (i = 0; i < len; ++i)
		if (!dr[v[x][i]]) {
			stg[x] = v[x][i];
			dr[v[x][i]] = x;
			return 1;
		}
	for (i = 0; i < len; ++i)
		if (adauga(dr[v[x][i]])) {
			stg[x] = v[x][i];
			dr[v[x][i]] = x;
			return 1;
		}
	return 0;
}

int main() {
	int x, y, i, ok;

	f >> m >> n >> e;

	for (i = 0; i < e; ++i) {
		f >> x >> y;
		v[x].push_back(y);
	}

	ok = 1;
	int nr = 0;
	while (ok) {
		ok = 0;
		memset(viz + 1, 0, m * sizeof(int));
		for (i = 1; i <= m; ++i)
			if (stg[i] == 0 && adauga(i)) {
				ok = 1;
				++nr;
			}
	}

	g << nr << '\n';
	for (i = 1; i <= m; ++i)
		if (stg[i] > 0)
			g << i << ' ' << stg[i] << '\n';

	return 0;
}