Cod sursa(job #750452)

Utilizator mr.johnFMI - Laceanu Ionut-Adrian mr.john Data 22 mai 2012 09:57:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector<int> graf[10003],l,r;
int n1, n2, m;

bitset<10003> viz;

bool cuplaj(int x){
	if(viz[x]) return false;
	viz[x]=true;
	for(vector<int>::iterator it=graf[x].begin();it!=graf[x].end();it++)
		if (!r[*it]){
			r[*it]=x;
			l[x]=*it;
			return true;
		}
	for(vector<int>::iterator it=graf[x].begin();it!=graf[x].end();it++)
		if(cuplaj(r[*it])){
			r[*it]=x;
			l[x]=*it;
			return true;
		}
	return false;
}		
		
int main(){
	int a,b,card_cuplaj=0;
	fin>>n1>>n2>>m;
	for(int i=1;i<=m;i++){
		fin>>a>>b;
		graf[a].push_back(b);
	}
	l=vector<int>(n1+3,0);
	r=vector<int>(n2+3,0);
	bool exista=true;
	while (exista){
		exista=false;
		viz.reset();
		for (int i=1;i<=n1;i++)
			if(l[i]==0 && cuplaj(i)==true){
				card_cuplaj++;
				exista=true;
			}
	}
	fout<<card_cuplaj<<"\n";
	for (int i=1;i<=n1;i++)
		if(l[i]) fout<<i<<" "<<l[i]<<"\n";
	return 0;	
}