Pagini recente » Cod sursa (job #2476224) | Cod sursa (job #1598249) | Cod sursa (job #198052) | Cod sursa (job #386428) | Cod sursa (job #1058612)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
class MaxMatching {
private :
vector< vector<int> > G;
int N;
vector<int> L;
vector<int> R;
vector<bool> visited;
bool match(const int &v) {
if (visited[v]) return false;
visited[v] = true;
for (const auto &w : G[v]) {
if (R[w] == -1 || match(R[w])) {
L[v] = w;
R[w] = v;
return true;
}
}
return false;
}
public :
MaxMatching(int n, int m) {
N = n;
int d = max(n, m);
G.resize(d, vector<int>());
visited.resize(d, false);
L.resize(d, -1);
R.resize(d, -1);
}
void addEdge(int x, int y) {
G[x].push_back(y);
}
vector< pair<int,int> > getMatching() {
vector< pair<int, int> > ret;
for (bool change = true; change;) {
change = false;
fill(visited.begin(), visited.end(), false);
for (int i = 0; i < N; i++) {
if (L[i] == -1) {
change |= match(i);
}
}
}
for (int i = 0; i < N; i++) {
if (L[i] != -1) {
ret.push_back(make_pair(i, L[i]));
}
}
return ret;
}
};
int main()
{
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int n, m, e;
cin >> n >> m >> e;
MaxMatching solver(n,m);
int a, b;
for (int i = 0; i < e; i++) {
cin >> a >> b;
a--, b--;
solver.addEdge(a, b);
}
vector< pair<int, int> > ans = solver.getMatching();
cout << ans.size() << "\n";
for (const auto &e : ans) {
cout << e.first + 1 << " " << e.second + 1 << "\n";
}
return 0;
}