Cod sursa(job #918443)

Utilizator iulianpopescu13Iulian Popescu iulianpopescu13 Data 18 martie 2013 21:22:03
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
# include <fstream>
# include <vector>
# define dim 100001
using namespace std;
vector < vector < int > > mat( dim );
vector< int > l( dim ), r( dim ), uz( dim );
int n,m,e;
inline void citire()
{
	ifstream fin("cuplaj.in");
	fin >> n >> m >> e;
	for(int i=1; i<=e; ++i )
	{
		int x,y;
		fin >> x >> y;
		mat[ x ].push_back( y+n );
		mat[ y+n ].push_back( x );
	}
}
inline void initializare()
{
	for(int i=1; i<=n; ++i )
		uz[ i ] = 0;
}	
inline int cupleaza( int x )
{
	if( uz[ x ] == 1 )
		return 0;
	uz[ x ] = 1;
	for(int i=0; i<mat[ x ].size(); ++i )
		if( !r[ mat[ x ][ i ] ] )
		{
			l[ x ] = mat[ x ][ i ];
			r[ mat[ x ][ i ] ] = x;
			return 1;
		}
	for(int i=0; i<mat[ x ].size(); ++i )
            if( cupleaza( r[ mat[ x ][ i ] ] ) )
            {
                l[ x ] = mat[ x ][ i ];
                r[ mat[ x ][ i ] ] = x;
                return 1;
            }
	return 0;
}
inline void afisare()
{
	ofstream fout("cuplaj.out");
	int nr=0;
	for(int i=1; i<=n; ++i )
		if( l[ i ] )
			nr ++;
	fout<<nr<<"\n";
	for(int i=1; i<=n; ++i )
		if( l[ i ] )
			fout << i << " " << l[ i ]-n <<"\n";
}
int main()
{
	citire();
	int ok = 0;
	while( ok==0 )
	{
		ok=1;
		initializare();
		for(int i=1; i<=n; ++i )
			if( !l[ i ] && cupleaza( i ) )
				ok = 0;
	}
	afisare();
}