MATCH1 - Cặp ghép không trọng số
Tác giả: RR
Ngôn ngữ: C++
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iomanip>
#include <complex>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <deque>
#include <bitset>
#include <cctype>
#include <utility>
#include <cassert>
#define FOR(i,a,b) for(int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for(int i=(a),_b=(b); i>=_b; i--)
#define REP(i,a) for(int i=0,_a=(a); i<_a; i++)
#define EACH(it,a) for(__typeof(a.begin()) it = a.begin(); it != a.end(); ++it)
#define DEBUG(x) { cout << #x << " = "; cout << (x) << endl; }
#define PR(a,n) { cout << #a << " = "; FOR(_,1,n) cout << a[_] << ' '; cout << endl; }
#define PR0(a,n) { cout << #a << " = "; REP(_,n) cout << a[_] << ' '; cout << endl; }
#define sqr(x) ((x) * (x))
using namespace std;
// Index from 0
// Assume 2 sides have same number of vertices
struct Matching {
int n;
vector< vector<int> > ke;
vector< bool > seen;
vector< int > matchL, matchR;
Matching(int n) : n(n), ke(n), seen(n, false), matchL(n, -1), matchR(n, -1) {
}
void addEdge(int u, int v) {
ke[u].push_back(v);
}
bool bpm(int u) {
for(__typeof(ke[u].begin()) v = ke[u].begin(); v != ke[u].end(); ++v) {
if (seen[*v]) continue;
seen[*v] = true;
if (matchR[*v] < 0 || bpm(matchR[*v])) {
matchL[u] = *v;
matchR[*v] = u;
return true;
}
}
return false;
}
int match() {
int res = 0;
for(int i = 0; i < n; ++i) {
for(int i = 0; i < n; ++i) seen[i] = false;
if (bpm(i)) ++res;
}
return res;
}
};
int main() {
ios :: sync_with_stdio(false); cin.tie(NULL);
int m, n;
while (cin >> m >> n) {
Matching match(max(m, n));
int u, v;
while (cin >> u >> v) {
--u; --v;
match.addEdge(u, v);
}
cout << match.match() << endl;
for(int i = 0; i < m; ++i)
if (match.matchL[i] >= 0)
cout << i+1 << ' ' << match.matchL[i] + 1 << "\n";
}
}