Pagini recente » Cod sursa (job #2218436) | Cod sursa (job #724463) | Rating Vlosta (VlostaClosta) | Cod sursa (job #2192852) | Cod sursa (job #2955896)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1007;
int n, m, e;
vector<int> adj[nmax];
int cap[nmax][nmax];
int par[nmax];
void bfs() {
memset(par, -1, sizeof(par));
queue<int> q;
q.push(1);
par[1] = 0;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : adj[u]) {
if (cap[u][v] > 0 && par[v] == -1) {
par[v] = u;
if (v != n + m + 2) q.push(v);
}
}
}
}
void solve() {
cin >> n >> m >> e;
for (int i = 0; i < e; i++) {
int u, v;
cin >> u >> v;
u = u + 1;
v = v + n + 1;
adj[u].push_back(v);
adj[v].push_back(u);
cap[u][v] = 1;
}
for (int i = 2; i <= n + 1; i++) {
adj[1].push_back(i);
adj[i].push_back(1);
cap[1][i] = 1;
}
for (int i = n + 2; i <= n + m + 1; i++) {
adj[i].push_back(n + m + 2);
adj[n + m + 2].push_back(i);
cap[i][n + m + 2] = 1;
}
int totalFlow = 0;
for (;;) {
bfs();
if (par[n + m + 2] == -1) break;
for (int v : adj[n + m + 2]) {
if (par[v] == -1 || cap[v][n + m + 2] == 0) continue;
int currentFlow = INT_MAX;
par[n] = v;
for (int u = n + m + 2; u != 1; u = par[u]) {
currentFlow = min(currentFlow, cap[par[u]][u]);
}
if (currentFlow == 0) continue;
for (int u = n + m + 2; u != 1; u = par[u]) {
cap[par[u]][u] -= currentFlow;
cap[u][par[u]] += currentFlow;
}
totalFlow += currentFlow;
}
}
cout << totalFlow << '\n';
for (int i = 2; i <= n + 1; i++) {
for (int v : adj[i]) {
if (cap[v][i] && v != 1) {
cout << i - 1 << ' ' << v - n - 1 << '\n';
break;
}
}
}
}
int main() {
#ifdef LOCAL
freopen("file.in", "r", stdin);
#else
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
#endif
ios_base::sync_with_stdio(false), cin.tie(NULL);
solve();
}