Cod sursa(job #1639147)

Utilizator howsiweiHow Si Wei howsiwei Data 8 martie 2016 11:06:59
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn0 = 1e4;
const int maxn1 = 1e4;
const int maxn = maxn0+maxn1;
vector<int> al[maxn0];
int mt[maxn];
char vis[maxn0];

bool dfs(int u) {
	vis[u] = true;
	for (int v: al[u]) {
		if (mt[v] == -1 || !vis[mt[v]] && dfs(mt[v])) {
			mt[v] = u;
			mt[u] = v;
			return true;
		}
	}
	return false;
}

int main() {
#ifdef INFOARENA
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);
#endif
	cin.sync_with_stdio(false);
	int n0, n1, m;
	cin >> n0 >> n1 >> m;
	memset(mt, -1, sizeof mt);
	for (int u, v, i = 0; i < m; i++) {
		cin >> u >> v;
		u--;
		v += n0-1;
		al[u].push_back(v);
	}
	int nm = 0;
	bool chg;
	do {
		chg = false;
		memset(vis, 0, sizeof vis);
		for (int u = 0; u < n0; u++) {
			if (mt[u] == -1 && !vis[u] && dfs(u)) {
				nm++;
				chg = true;
			}
		}
	} while (chg);
	printf("%d\n", nm);
	for (int u = 0; u < n0; u++) {
		if (mt[u] != -1)
			printf("%d %d\n", u+1, mt[u]-n0+1);
	}
	return 0;
}