Cod sursa(job #641104)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 27 noiembrie 2011 12:28:31
Problema Cuplaj maxim in graf bipartit Scor 44
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<vector>
using namespace std;
vector <short> v[10010];
int a,b,viz[10010],L[10010],R[10010],lvl=1,nr;
void afis() {
	int nod;
	ofstream out("cuplaj.out");
	out<<nr<<'\n';
	for(nod=1;nod<=a;nod++)
		if(R[nod])
			out<<nod<<' '<<R[nod]<<'\n';
	out.close();
}
bool cuplaj(int nod) {
	unsigned int i,vecin;
	viz[nod]=lvl;
	for(i=0;i<v[nod].size();i++) {
		vecin=v[nod][i];
		if(!L[vecin]) {
			L[vecin]=nod;
			R[nod]=vecin;
			return 1;
			}
		}
	for(i=0;i<v[nod].size();i++) {
		vecin=v[nod][i];
		if(viz[L[vecin]]!=lvl)
			if(cuplaj(L[vecin])) {
				R[nod]=vecin;
				return 1;
				}
		}
	return 0;
}
void rez() {
	int yvec=-1,ynou=0,nod;
	while(yvec<ynou) {
		yvec=ynou;
		for(nod=1;nod<=a;nod++)
			if(!R[nod])
				if(cuplaj(nod))
					ynou++;
		lvl++;
		}
	nr=ynou;
}
void citire() {
	int i,m,x,y;
	ifstream in("cuplaj.in");
	in>>a>>b>>m;
	for(i=0;i<m;i++) {
		in>>x>>y;
		v[x].push_back(y);
		}
	in.close();
}
int main() {
	citire();
	rez();
	afis();
	return 0;
}