Cod sursa(job #2915995)

Utilizator lolismekAlex Jerpelea lolismek Data 27 iulie 2022 14:23:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int N =  1e4;
vector <int> adj[N + 1];
int n1, n2, m, l[N + 1], r[N + 1];
bool viz[N + 1];

bool pairUp(int nod){
	if(viz[nod])
		return false;

	viz[nod] = true;

	for(int vec : adj[nod])
		if(!r[vec]){
			l[nod] = vec, r[vec] = nod;
			return true;
		}

	for(int vec : adj[nod])
		if(pairUp(r[vec])){
			l[nod] = vec, r[vec] = nod;
			return true;
		}

	return false;
}

int main(){

	fin >> n1 >> n2 >> m;

	for(int i = 1; i <= m; i++){
		int a, b;
		fin >> a >> b;
		adj[a].push_back(b);
	}

	while(true){	
		for(int i = 1; i <= n1; i++)
			viz[i] = false;

		bool ok = false;
		for(int i = 1; i <= n1; i++)
			if(!l[i])
				ok |= pairUp(i);

		if(!ok)
			break;
	}

	int maxMatch = 0;
	for(int i = 1; i <= n1; i++)
		if(l[i])
			maxMatch++;

	fout << maxMatch << '\n';
	for(int i = 1; i <= n1; i++)
		if(l[i])
			fout << i << ' ' << l[i] << '\n';

	return 0;
}