Cod sursa(job #749648)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 17 mai 2012 22:36:25
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<fstream>
#include<vector>
#include<algorithm>
#include<string.h>
#define max 10010
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int>G[max];
int w[max],s[max],d[max],n,m,M,CM,x,y,i,modif;
int cupleaza(int x){
	
	if(w[x])
		return 0;
	w[x]=1;
	
	for(int i=0;i<G[x].size();++i){
		if(!d[G[x][i]]){
			
			s[x]=G[x][i];
			d[G[x][i]]=x;
			return 1;
		}
	}
	for(int i=0;i<G[x].size();++i){
		if(cupleaza(d[G[x][i]])){
			
			s[x]=G[x][i];
			d[G[x][i]]=x;
			return 1;
		}
	}
	return 0;
}
int main (){
	f>>n>>m>>M;
	
	
	for(i=1;i<=M;++i){
		
		f>>x>>y;
		G[x].push_back(y);
		
	}
	modif=1;
	do{
		modif=0;
		memset(w,0,sizeof(w));
		for(i=1;i<=n;++i)
			if(!s[i])
				modif|=cupleaza(i);		
	}while(modif);
	
	for(i=1;i<=n;i++)
		if(s[i])
			CM++;
	g<<CM<<"\n";
	for(i=1;i<=n;i++)
		if(s[i]){
			g<<i<<" "<<s[i]<<"\n";
		}
	return 0;
}