Cod sursa(job #933175)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 29 martie 2013 17:51:38
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#include<vector>
#include<string.h>

using namespace std;

#define max_n 10010

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

vector<int> L[max_n];
int n , m , e , i , x , y , nr , ok = 1;
int Viz[max_n] , st[max_n] , dr[max_n];

void read(){
	
	f>>n>>m>>e;
	
	for(int i = 1 ; i <= e ; i++){
		f>>x>>y;
		L[x].push_back(y);
	}
	
}

bool dfs(int nod){
	
	if(Viz[nod])
		return 0;
	
	Viz[nod] = 1;
	
	for(int j = 0 ; j < L[nod].size() ; j++){
		if(dr[L[nod][j]] == 0){
			dr[L[nod][j]] = nod;
			st[nod] = L[nod][j];
			nr++;
			return 1;
		}
	}
	
	for(int j = 0 ; j < L[nod].size() ; j++){
		if( dfs( dr[L[nod][j]] ) ){
			dr[L[nod][j]] = nod;
			st[nod] = L[nod][j];
			return 1;
		}
	}
	
	return 0;
}

void print(){
	g<<nr<<"\n";
	for(int i = 1 ; i <= n ; i++){
		if(st[i])
			g<<i<<" "<<st[i]<<"\n";
	}
}

int main(){
	
	read();
	
	while(ok){
		ok = 0; memset(Viz , 0 , sizeof(Viz));
		for(i = 1 ; i <= n ; i++) if(st[i] == 0) ok = dfs(i);
	}
	
	print();
	
	return 0;
}