Pagini recente » Cod sursa (job #344985) | Cod sursa (job #2126392) | Cod sursa (job #1130936) | Cod sursa (job #1225991) | Cod sursa (job #3300671)
#include <bits/stdc++.h>
using namespace std;
int main() {
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, e;
fin >> n >> m >> e;
int old_n = n;
n += m;
vector<vector<int>> adj(n + 2);
vector<vector<int>> c(n + 2, vector<int>(n + 2));
for (int i = 1, u, v; i <= e; ++i) {
fin >> u >> v;
v += old_n;
adj[u].push_back(v);
adj[v].push_back(u);
c[u][v] = 1;
}
int s = 0, t = n + 1;
for (int i = 1; i <= old_n; ++i) {
adj[s].push_back(i);
adj[i].push_back(s);
c[s][i] = 1;
}
for (int i = old_n + 1; i <= n; ++i) {
adj[i].push_back(t);
adj[t].push_back(i);
c[i][t] = 1;
}
vector<int> parent(n + 2);
function<int()> bfs = [&]() -> int {
fill(parent.begin(), parent.end(), -1);
parent[s] = -2;
queue<pair<int, int>> q;
int curr = 2;
q.emplace(s, curr);
while (!q.empty()) {
auto [u, curr] = q.front(); q.pop();
for (int v : adj[u]) {
if (parent[v] == -1 && c[u][v]) {
int new_f = min(curr, c[u][v]);
parent[v] = u;
if (v == t)
return new_f;
q.emplace(v, new_f);
}
}
}
return 0;
};
int flow = 0, newf;
while (newf = bfs()) {
flow += newf;
int nod = t;
while (nod != s) {
int prev = parent[nod];
c[prev][nod] -= newf;
c[nod][prev] += newf;
nod = prev;
}
}
fout << flow << '\n';
for (int i = 1; i <= old_n; ++i) {
for (int j = old_n + 1; j <= n; ++j) {
if (c[j][i] != 0) {
fout << i << ' ' << j - old_n << '\n';
}
}
}
return 0;
}