Cod sursa(job #2694407)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 9 ianuarie 2021 10:09:30
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>

using namespace std;

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

int n, m, e;

const int N = 10041;
vector<int> gra[N];

int rt[N], lt[N];

int ans = 0;

bitset<N> vi;
bool baga(int a){
	if(vi[a])return false;
	vi[a] = true;
	for(auto b : gra[a]){
		if(lt[b] == 0){
			rt[a] = b;
			lt[b] = a;
			return true;
		}
	}
	for(auto b : gra[a]){
		if(baga(lt[b])){
			rt[a] = b;
			lt[b] = a;
			return true;
		}
	}
	return false;
}

int main(){
	// ios_base::sync_with_stdio(false);
	
	fin >> n >> m >> e;
	for(int i = 0; i < e; ++i){
		int a, b;
		fin >> a >> b;
		gra[a].push_back(b);
	}
	
	bool ok = true;
	while(ok){
		ok = false;
		ans = 0;
		for(int a = 1; a <= n; ++a){
			vi.reset();
			ok |= baga(a);
			ans += int(rt[a]!=0);
		}
	}
	
	fout << ans << "\n";
	for(int i = 1; i <= n; ++i){
		if(rt[i] == 0)continue;
		fout << i << " " << rt[i] << "\n";
	}
	
	return 0;
}