Cod sursa(job #989846)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 26 august 2013 16:36:41
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <iostream>
using namespace std;

#include <vector>

#define LE 66666
int n,n2,m;
vector<int> H[LE];

bool viz[LE];
bool cpl[LE];
int i,j,cuplaj[LE];

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

#define pb push_back


bool dfs(int nod){
	int N=H[nod].size(),i;
	viz[nod]=true;
	
	for(i=0;i<N;++i)
		if (viz[H[nod][i]]==false){
			if (cpl[H[nod][i]]==false) {
				
				cpl[nod]=cpl[H[nod][i]]=true;
				cuplaj[nod]=H[nod][i];
				cuplaj[H[nod][i]]=nod;
				viz[H[nod][i]]=true;
				return true;
			}
		    viz[H[nod][i]]=true;
			
			if ( dfs(cuplaj[H[nod][i]]) ){
				cpl[nod]=cpl[H[nod][i]]=true;
				cuplaj[nod]=H[nod][i];
				cuplaj[H[nod][i]]=nod;
				return true;
			}
		}
  return false;
}
int result;

int main(){
	f>>n>>n2>>m;
	
	for(i=1;i<=m;++i){
	   int xx,yy;
	   f>>xx>>yy;
	   H[xx].pb(yy+n);
	   H[yy+n].pb(xx);
	}
	
	for(i=1;i<=n;++i){
		if (cpl[i]==false){
		   for(j=1;j<=n+n2;++j) viz[j]=false;
		 
		   for(j=i;j<=n;++j)  
			   if(viz[j]==false&&cpl[j]==false)
					if (dfs(j)) ++result;
		}
	}
	
	g<<result<<'\n';

	for(i=1;i<=n;++i) if (cpl[i]==true)
		  g<<i<<" "<<cuplaj[i]-n<<'\n';
	
	return 0;
}