Cod sursa(job #3324718)

Utilizator CosminaneBoac Mihai Cosmin Cosminane Data 23 noiembrie 2025 11:38:46
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>
using namespace std;
vector <int> v[10005];
int viz[10005], tata[10005], gasit[10005];
bool dfs( int x ){
	int i;
	if( viz[x] == 1 ){
		return 0;
	}
	viz[x] = 1;
	for( i = 0; i < v[x].size(); i++ ){
		if( tata[v[x][i]] == -1 ){
			tata[v[x][i]] = x;
			gasit[x] = 1;
			return 1;
		}
	}
	for( i = 0; i < v[x].size(); i++ ){
		if( dfs( tata[v[x][i]] ) ){
			tata[v[x][i]] = x;
			gasit[x] = 1;
			return 1;
		}
	}
	return 0;
}
int main() {
	int n, m, e, i, x, y, r, ok;
	ifstream fin( "cuplaj.in" );
	ofstream fout( "cuplaj.out" );
	fin >> n >> m >> e;
	for( i = 0; i < e; i++ ){
		fin >> x >> y;
		v[x].push_back( y );
	}
	for( i = 1; i <= m; i++ ){
		tata[i] = -1;
	}
	ok = 1;
	while( ok == 1 ){
		ok = 0;
		memset( viz, 0, sizeof( viz ) );
		for( i = 1; i <= n; ++i ){
			if( gasit[i] == 0 ){
				ok |= dfs( i );
			}
		}
    }
	r = 0;
	for( i = 1; i <= n; i++ ){
		if( gasit[i] ){
			r++;
		}
	}
	fout << r << '\n';
	for( i = 1; i <= m; i++ ){
		if( tata[i] != -1 ){
			fout << tata[i] << ' ' << i << '\n';
		}
	}
	return 0;
}