Cod sursa(job #2753555)

Utilizator MateGMGozner Mate MateGM Data 23 mai 2021 13:25:53
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

ifstream be("cuplaj.in");
ofstream ki("cuplaj.out");

void beolvas(vector<vector<int>>& sz_lista, int m);
bool parosit(const vector<vector<int>>& sz_lista, int u, vector<bool>& latogatott, vector<int>& par_l, vector<int>& par_r);
void max_parositas(const vector<vector<int>>& sz_lista, int l, int r);

int main()
{
	int l, r, m;
	be >> l >> r >> m;
	vector<vector<int>> sz_lista(l);
	beolvas(sz_lista, m);
	max_parositas(sz_lista, l, r);
}

void beolvas(vector<vector<int>>& sz_lista, int m) {
	for (int i = 0; i < m; i++) {
		int x, y;
		be >> x >> y;
		sz_lista[x - 1].push_back(y - 1);
	}
}

bool parosit(const vector<vector<int>>& sz_lista, int u, vector<bool>& latogatott, vector<int>& par_l, vector<int>& par_r){
	
	if (latogatott[u]) return false;
	latogatott[u] = true;

	for (int szomsz : sz_lista[u]) {
		if (par_r[szomsz] == -1) {
			par_r[szomsz] = u;
			par_l[u] = szomsz;
			return true;
		}
	}

	for (int szomsz : sz_lista[u]) {
		if (parosit(sz_lista, par_r[szomsz], latogatott, par_l, par_r)) {
			par_r[szomsz] = u;
			par_l[u] = szomsz;
			return true;
		}
	}

	return false;
}

void max_parositas(const vector<vector<int>>& sz_lista, int l, int r) {
	vector<bool> latogatott(l + r, false);
	vector<int> par_l(l, -1);
	vector<int> par_r(r, -1);
	int elek_szama = 0;

	for (int i = 0; i < l; i++) {
		if (!parosit(sz_lista, i, latogatott, par_l, par_r)) {
			for (int i = 0; i < l + r; i++)
				latogatott[i] = false;
			if (parosit(sz_lista, i, latogatott, par_l, par_r))
				elek_szama += 1;
		}
		else elek_szama += 1;
	}

	ki << elek_szama << "\n";

	for (int i = 0; i < l; i++){
		if (par_l[i] != -1) ki << i + 1 << " " << par_l[i] + 1 << "\n";
	}

}