Cod sursa(job #566193)

Utilizator Robert29FMI Tilica Robert Robert29 Data 28 martie 2011 19:19:00
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fi ("cuplaj.in");
ofstream fo ("cuplaj.out");
vector <int> v[10001];
int sol,s[10001],d[10001],x,y,i,n,m,e;
char viz[10001];
int cuplaj(int x){
	if (viz[x])
		return 0;
	viz[x]=1;
	for(int j=0;j<v[x].size();++j)
		if(!d[v[x][j]]){
			s[x]=v[x][j];
			d[v[x][j]]=x;
			return 1;
		}
	for(int j=0;j<v[x].size();++j)
		if(cuplaj(d[v[x][j]])){
			s[x]=v[x][j];
			d[v[x][j]]=x;
			return 1;
		}
	return 0;	
}
int main(){
	fi>>n>>m>>e;
	for(i=1;i<=e;++i){
		fi>>x>>y;
		v[x].push_back (y);
	}
	int ok=1;
	while(ok){
		ok=0;
		memset(viz,0,sizeof(viz));
		for(i=1;i<=n;++i)
			if(!s[i])
				ok=cuplaj(i);
	}
	
	for(i=1;i<=n;++i)
		if(s[i])
			sol++;
	fo<<sol<<'\n';	
	for(i=1;i<=n;++i)
		if(s[i])
			fo<<i<<' '<<s[i]<<'\n';
	
	fo.close();
	fi.close();
	return 0;
}