Cod sursa(job #1121098)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 25 februarie 2014 11:32:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include<fstream>
#include<cstring>
#include<vector>
#define dim 10007

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

int viz[dim],r[dim],l[dim];
int x,y,n,m,e,cnt;
vector<int >G[dim];
bool ok;
int cuplaj(int nod){
	
	if(viz[nod])
		return 0;
	viz[nod]=1;
	
	for(int i=0;i<G[nod].size();++i){
		int fiu=G[nod][i];
		if(!r[fiu] || cuplaj (r[fiu])){
			r[fiu]=nod;
			l[nod]=fiu;
			return 1;
		}			
	}
	return 0;
}
int main () {
	
	f>>n>>m>>e;
	
	for(int i=1;i<=e;++i){
		f>>x>>y;
		G[x].push_back(y);
	}
	
	do {
		ok=0;
		memset(viz,0,sizeof(viz));
		
		for(int i=1;i<=n;++i){
			if(!l[i])
				ok|=cuplaj(i);
		}
		
	}while(ok);
	
	for(int i=1;i<=n;++i){
		cnt+=(l[i]>0);
	}
	
	g<<cnt<<"\n";
	
	for(int i=1;i<=n;++i){
		if(l[i]){
			g<<i<<" "<<l[i]<<"\n";
		}
	}
	return 0;
}