Pagini recente » Cod sursa (job #118783) | Cod sursa (job #2307880) | Cod sursa (job #3167342) | Cod sursa (job #2773897) | Cod sursa (job #2430706)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10000;
class BipartiteMatcher {
public:
vector<vector<int> >G;
vector<int>L, R;
private:
vector<int>vis;
bool pairUp(int node) {
if (vis[node])
return false;
vis[node] = true;
for (auto it:G[node])
if (L[it] == 0) {
R[node] = it;
L[it] = node;
return true;
}
for (auto it:G[node])
if (pairUp(L[it])) {
R[node] = it;
L[it] = node;
return true;
}
return false;
}
public:
BipartiteMatcher(int n, int m) {
G.resize(n + 1);
L.resize(m + 1); R.resize(n + 1);
vis.resize(n + 1);
}
void addEdge(int u, int v) {
G[u].push_back(v);
}
int maxMatch() {
bool ok;
int ans = 0;
do {
ok = false;
fill(vis.begin(), vis.end(), 0);
for (int i = 1; i <= (int)R.size(); ++i)
if (R[i] == 0 && pairUp(i))
ok = 1, ans++;
} while (ok);
return ans;
}
void resetMatch() {
fill(L.begin(), L.end(), 0);
fill(R.begin(), R.end(), 0);
fill(vis.begin(), vis.end(), 0);
}
void reset() {
resetMatch();
fill(G.begin(), G.end(), vector<int>());
}
void printMatch() {
printf("%d\n", maxMatch());
for (int i = 1; i < (int)R.size(); ++i)
if (R[i])
printf("%d %d\n", i, R[i]);
}
};
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int n, m, e;
scanf("%d%d%d", &n, &m, &e);
BipartiteMatcher M(n, m);
for (int i = 1; i <= e; ++i) {
int u, v;
scanf("%d%d", &u, &v);
M.addEdge(u, v);
}
M.printMatch();
return 0;
}