Cod sursa(job #2654438)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 30 septembrie 2020 22:00:45
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <vector>
#include <cstring>

using namespace std;

vector<vector<int>> neighbors;
bool used[10003];
int  parent[10003], son[10003];


bool pairup(int current_node) {
	if (used[current_node])
		return 0;

	used[current_node] = true;
	for(int i = 0; i< neighbors[current_node].size() ; ++i)
		if (!parent[neighbors[current_node][i]]) {
			parent[neighbors[current_node][i]] = current_node;
			son[current_node] = neighbors[current_node][i];
			return true;
		}

	for(int i = 0; i< neighbors[current_node].size(); ++i)
		if (pairup(neighbors[current_node][i])) {
			parent[neighbors[current_node][i]] = current_node;
			son[current_node] = neighbors[current_node][i];
			return true;
		}

	return false;
}


int main() {
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

	int n, m, e, a, b;

	scanf("%d%d%d", &n, &m, &e);
	neighbors.resize(n+1);

	for(int i=0; i<e; ++i) {
		scanf("%d%d", &a, &b);
		neighbors[a].push_back(b);
	}

	int change = 1;
	while(change) {
		change = 0;
		memset(used, 0, sizeof(used));

		for(int i=1; i<=n; ++i)
			if (! son[i])
				change += pairup(i);
	}

	int res = 0;
	for(int i=1; i<=n; ++i)
		if (son[i])
			++res;
	printf("%d\n", res);
	for(int i=1; i<=n; ++i)
		if (son[i])
			printf("%d %d\n", i, son[i]);

	return 0;
}