Cod sursa(job #2080242)

Utilizator ice_creamIce Cream ice_cream Data 2 decembrie 2017 17:20:51
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 10000;
const int MMAX = 10000;

int n, m;
vector <int> graf[NMAX + 1];

int a[MMAX + 1];
int b[NMAX + 1];

bool vizitat[NMAX];

void citeste() {
	int e, a, b;
	f >> n >> m >> e;
	for (int i = 1; i <= e; i++) {
		f >> a >> b;
		graf[a].push_back(b);
	}
}

bool assign(int nod) {
	if (vizitat[nod]) return false;
	vizitat[nod] = true;

	int l = graf[nod].size();
	for (int i = 0; i < l; i++) {
		int fiu = graf[nod][i];
		if (!a[fiu]) {
			a[fiu] = nod;
			b[nod] = fiu;
			return true;
		}
	}

	for (int i = 0; i < l; i++) {
		int fiu = graf[nod][i];
		if (assign(a[fiu])) {
			a[fiu] = nod;
			b[nod] = fiu;
			return true;
		}
	}

	return false;
}

void rezolva() {
	bool done = false;

	while (!done) {
		done = true;
		for (int i = 1; i <= n; i++) vizitat[i] = false;
		for (int i = 1; i <= n; i++)
			if (!b[i]) 
				if (assign(i)) done = false;
	}
}

void scrie() {
	int sol = 0;
	for (int i = 1; i <= n; i++)
		if (b[i]) sol++;
	g << sol << '\n';
	for (int i = 1; i <= n; i++)
		if (b[i]) g << i << ' ' << b[i] << '\n';
}

int main() {
	citeste();
	rezolva();
	scrie();
	return 0;
}