Pagini recente » Cod sursa (job #2908673) | Cod sursa (job #967205) | Cod sursa (job #2535761) | Cod sursa (job #839343) | Cod sursa (job #2207370)
#include <bits/stdc++.h>
using namespace std;
#if 1
#define pv(x) cout<<#x<<" = "<<(x)<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif
#ifdef INFOARENA
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
#else
#define in cin
#define out cout
#endif
using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
#define pb push_back
#define mp make_pair
const int NMax = 2e4 + 5;
const ll inf_ll = 1e18 + 5;
const int inf_int = 1e9 + 5;
const int mod = 100003;
using zint = int;
map< pair<int,int>, bool > edgeMap;
bool vis[NMax];
vector<int> adj[NMax];
bool dfs(int node, int dest) {
if (node == dest) {
return true;
}
vis[node] = true;
for (int i = 0; i < (int)adj[node].size(); ++i) {
int nxt = adj[node][i];
if (vis[nxt]) {
continue;
}
if (dfs(nxt, dest)) {
adj[node].erase(adj[node].begin() + i);
edgeMap[ {node, nxt} ] = true;
edgeMap[ {nxt, node} ] = false;
adj[nxt].pb(node);
return true;
}
}
return false;
}
int main() {
cin.sync_with_stdio(false);
cin.tie(0);
int N, M, E;
in >> N >> M >> E;
for (int i = 1;i <= E; ++i) {
int x,y;
in >> x >> y;
y += N;
// out << x << ' ' << y << '\n';
adj[x].pb(y);
}
for (int i = 1;i <= N; ++i) {
adj[N+M+1].pb(i);
}
for (int i = M+1; i <= N+M; ++i) {
adj[i].pb(N+M+2);
}
int source = N + M + 1;
int dest = N + M + 2;
int maxFlow = 0;
while (dfs(source, dest)) {
++maxFlow;
memset(vis, 0, sizeof(vis));
}
out << maxFlow << '\n';
for (auto it : edgeMap) {
if (it.second && 1 <= it.first.first && it.first.first <= N) {
out << it.first.first << ' ' << it.first.second - N << '\n';
}
}
return 0;
}