Cod sursa(job #1639040)

Utilizator howsiweiHow Si Wei howsiwei Data 8 martie 2016 10:40:43
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;

vector<vector<int>> al;
vector<int> mt;
vector<bool> vis;

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;
	al.resize(n0);
	mt.assign(n0+n1, -1);
	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;
	vector<int> p(n0);
	do {
		chg = false;
		vis.assign(n0, false);
		for (int s = 0; s < n0; s++) if (mt[s] == -1) {
			queue<int> q;
			q.push(s);
			vis[s] = true;
			// printf("s: %d\n", s);
			int ut, t = -1;
			do {
				int u = q.front();
				q.pop();
				for (int v: al[u]) {
					if (mt[v] == -1) {
						ut = u;
						t = v;
						break;
					} else if (!vis[mt[v]]) {
						q.push(mt[v]);
						vis[mt[v]] = true;
						p[mt[v]] = u;
					}
				}
				if (t != -1) {
					int u = ut;
					int v = t;
					while (true) {
						mt[v] = u;
						int v1 = mt[u];
						mt[u] = v;
						if (u == s) break;
						u = p[u];
						v = v1;
					}
					nm++;
					chg = true;
					break;
				}
			} while (!q.empty());
		}
	} 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;
}