Cod sursa(job #1549386)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 12 decembrie 2015 11:54:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 10005;
vector <int> g[MAX];
int st[MAX], dr[MAX],vis[MAX];

int dfs(int i) {
	int s;
	if (vis[i]) 
		return false;
	vis[i] = true;
	for (int j = 0; j < g[i].size(); j++) {
		s = g[i][j];
		if (dr[s] == 0) {
			st[i] = s;
			dr[s] = i;
			return true;
		}
		if (dfs(dr[s])) {
			st[i] = s;
			dr[s] = i;
			return true;
		}
	}
	return false;
}

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

	int n, m, e, nr = 0;
	cin >> n >> m >> e;
	for (int i = 1; i <= e; i++) {
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
	}
	int ok = 1;
	while (ok) {
		ok = false;
		memset(vis, 0, sizeof(vis));
		for (int i = 1; i <= n; i++)
			if (st[i] == 0 && dfs(i)) 
				ok = true;
	}	
	for (int i = 1; i <= n; i++)
		if (st[i]) 
			nr++;
	cout << nr << "\n";
	for (int i = 1; i <= n; i++)
		if (st[i]) 
			cout << i << " " << st[i] << "\n";


	return 0;
}