Pagini recente » Cod sursa (job #2966041) | Cod sursa (job #267628) | Cod sursa (job #1941747) | Cod sursa (job #1038759) | Cod sursa (job #2956291)
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e4 + 7;
const int mmax = 1e4 + 7;
const int maxnodes = nmax + mmax;
const int maxedges = maxnodes * 2;
struct Edge {
int u, v;
int pid;
bool c;
};
int n, m, k, s, d;
int node[maxnodes];
bool vis[maxnodes];
int par[maxnodes];
Edge e[maxedges];
vector<int> adj[maxnodes];
void bfs() {
memset(vis, 0, sizeof(vis));
queue<int> q;
q.push(0);
vis[0] = true;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int eid : adj[u]) {
const auto& [u, v, pid, c] = e[eid];
if (c && !vis[v]) {
par[v] = eid;
vis[v] = true;
if (v != d) q.push(v);
}
}
}
}
void solve() {
int edges = 0;
cin >> n >> m >> k;
s = 0, d = n + m + 1;
for (int i = 0; i < k; i++) {
int u, v;
cin >> u >> v;
e[edges] = {u, v + n, edges + 1, 1};
e[edges + 1] = {v + n, u, edges, 0};
adj[u].push_back(edges);
adj[v + n].push_back(edges + 1);
edges += 2;
}
for (int u = 1; u <= n; u++) {
node[u] = u;
e[edges] = {s, u, edges + 1, 1};
e[edges + 1] = {u, s, edges, 0};
adj[s].push_back(edges);
adj[u].push_back(edges + 1);
edges += 2;
}
for (int v = 1; v <= m; v++) {
node[v + n] = v;
e[edges] = {v + n, d, edges + 1, 1};
e[edges + 1] = {d, v + n, edges, 0};
adj[v + n].push_back(edges);
adj[d].push_back(edges + 1);
edges += 2;
}
int totalFlow = 0;
for (;;) {
bfs();
if (!vis[d]) break;
for (int eid : adj[d]) {
const auto& [d, v, pid, c] = e[eid];
if (!vis[v] || c) continue;
bool currentFlow = true;
par[d] = e[eid].pid;
for (int u = d; u != s; u = e[par[u]].u) {
currentFlow &= e[par[u]].c;
}
if (!currentFlow) continue;
for (int u = d; u != s; u = e[par[u]].u) {
e[par[u]].c = false;
e[e[par[u]].pid].c = true;
}
totalFlow++;
}
}
cout << totalFlow << endl;
for (int u = 1; u <= n; u++) {
for (int eid : adj[u]) {
if (e[eid].v != s && !e[eid].c) {
cout << u << ' ' << node[e[eid].v ]<< '\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();
}