Cod sursa(job #2694408)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 9 ianuarie 2021 10:12:17
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 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;
		vi.reset();
		for(int a = 1; a <= n; ++a){
			if(rt[a] == 0){
				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;
}