Cod sursa(job #1436545)

Utilizator OpportunityVlad Negura Opportunity Data 16 mai 2015 01:16:31
Problema Cuplaj maxim in graf bipartit Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");

int n,m,v,viz[10001],x,y,i,j,rs,l[10001],r[10001];
vector <int> g[10001];

int cuplaj(int nod, int vizitNr) {
	if (viz[nod] == vizitNr) {
		return 0;
	}
	viz[nod] = vizitNr;

	for (vector <int>::iterator it = g[nod].begin(); it != g[nod].end(); it++) {
		if (viz[r[*it]] != vizitNr) {
			if (!r[*it] || cuplaj(r[*it], vizitNr)) {
				l[nod] = *it;
				r[*it] = nod;
				return 1;
			}	
		}
	}

	return 0;
}

int main() {

	fi >> n >> m >> v;

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

	int ok = 1, vizitNr = 1;
	while (ok) {
		ok = 0;
		vizitNr++;

		for (i = 1; i <= n; i++) {
			if (!l[i]) {
				if (cuplaj(i, vizitNr)) {
					rs++;
					ok = 1;
				}
			}
			
		}
	}

	fo << rs << endl;

	for (i = 1; i <= n; i++) {
		if (l[i]) {
			fo << i << ' ' << l[i] << endl;
		}
	}

	return 0;
}