Pagini recente » Borderou de evaluare (job #2505821) | Cod sursa (job #790299) | Cod sursa (job #732349) | Cod sursa (job #63526) | Cod sursa (job #3357993)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1e4 + 5;
int n, m, e, d[NMAX], match[NMAX], dist[NMAX];
vector<int> g[NMAX];
queue<int> q;
bool bfs() {
for (int i = 1; i <= n; i++) {
if (!match[i]) {
dist[i] = 0;
q.push(i);
} else {
dist[i] = NMAX;
}
}
dist[0] = NMAX;
while (!q.empty()) {
int u = q.front();
q.pop();
if (dist[u] < dist[0]) {
for (int v : g[u]) {
if (dist[match[v]] == NMAX) {
dist[match[v]] = dist[u] + 1;
q.push(match[v]);
}
}
}
}
return dist[0] != NMAX;
}
bool dfs(int u) {
if (u != 0) {
for (int v : g[u]) {
if (dist[match[v]] == dist[u] + 1 && dfs(match[v])) {
match[u] = v;
match[v] = u;
return true;
}
}
dist[u] = NMAX;
return false;
}
return true;
}
int main() {
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
fin >> n >> m >> e;
for (int i = 1; i <= e; i++) {
int u, v;
fin >> u >> v;
g[u].push_back(v + n);
}
int ans = 0;
while (bfs()) {
for (int i = 1; i <= n; i++) {
if (!match[i] && dfs(i)) {
ans++;
}
}
}
fout << ans << '\n';
for (int i = 1; i <= n; i++) {
if (match[i]) {
fout << i << ' ' << match[i] - n << '\n';
}
}
return 0;
}