Cod sursa(job #2677185)

Utilizator davidcotigacotiga david davidcotiga Data 25 noiembrie 2020 22:19:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <cmath>
#include <stdio.h>

#define MAX 10005

using namespace std;

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

int N, M, E;
vector<int> Graf[MAX];
int v1[MAX], v2[MAX];
int checked[MAX];
int current;

void read() {
	fin >> N >> M >> E;

	int x, y;
	while (E--) {
		fin >> x >> y;
		Graf[x].push_back(y);
	}
}

bool augmentez(const int u) {

	if (checked[u] == current)
		return false;

	checked[u] = current;

	for (auto& it : Graf[u]) {
		if (!v2[it]) {
			v2[it] = u;
			v1[u] = it;
			return true;
		}
	}

	for (auto& it : Graf[u]) {
		if (augmentez(v2[it])) {
			v1[u] = it;
			v2[it] = u;
			return true;
		}
	}
	return false;
}

void cuplaj() {
	int ans = 0;
	bool exista = 1;
	current = 1;

	while (exista) {
		exista = 0;

		for (int i = 1; i <= N; ++i)
			if (!v1[i])
				exista |= augmentez(i);
		++current;
	}

	for (int i = 1; i <= N; ++i)
		if (v1[i])
			++ans;

	fout << ans << "\n";
	for (int i = 1; i <= N; ++i)
		if (v1[i])
			fout << i << " " << v1[i] << "\n";
}

int main() {

	read();
	cuplaj();

	return 0;
}