Pagini recente » Cod sursa (job #262578) | Cod sursa (job #2146388) | Cod sursa (job #2239976) | Cod sursa (job #1566922) | Cod sursa (job #1953690)
#include <cstdio>
#include <climits>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cassert>
#include <queue>
using namespace std;
#ifdef INFOARENA
#define ProblemName "cuplaj"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
typedef long long LL;
#define MAXN 1100
typedef vector< vector<int> > graph;
graph G;
int N;
int C[MAXN][MAXN];
int nedge[MAXN], dst[MAXN], Q[MAXN];
int L, R, E;
int _;
int ql, qr;
#define INFINIT 0x3F3F3F3F
bool BFS(int s) {
memset(dst, 0x3F, sizeof(dst));
dst[s] = 0;
ql = 0, qr = 1;
while ((ql < qr) && (dst[N - 1] == INFINIT)) {
int t = Q[ql++];
for (int i = 0; i != (int)G[t].size(); ++i) {
int u = G[t][i];
if (!C[t][u]) continue;
if (dst[u] != INFINIT) continue;
dst[u] = dst[t] + 1;
Q[qr++] = u;
}
}
return (dst[N - 1] != INFINIT);
}
int DFS(int v, int flow) {
if (v == (N - 1)) return flow;
for (; nedge[v] != (int)G[v].size(); ++nedge[v]) {
int u = G[v][nedge[v]];
if (!C[v][u]) continue;
if (dst[v] + 1 != dst[u]) continue;
int actualFlow = DFS(u, min(C[v][u], flow));
if (actualFlow == 0) continue;
C[v][u] -= actualFlow;
C[u][v] += actualFlow;
return actualFlow;
}
return 0;
}
int blockingFlow() {
int totalFlow = 0;
memset(nedge, 0, sizeof(nedge));
int flow = 0;
while ((flow = DFS(0, INFINIT))) totalFlow += flow;
return totalFlow;
}
int Dinic() {
int flow = 0;
while (BFS(0)) flow += blockingFlow();
return flow;
}
void input() {
_ = scanf("%d%d%d", &L, &R, &E);
N = L + R + 2;
G.resize(N);
for (int i = 0; i < E; ++i) {
int a, b;
_ = scanf("%d%d", &a, &b);
b += L;
if (!C[a][b]) G[a].push_back(b);
if (!C[b][a]) G[b].push_back(a);
C[a][b]++;
}
for (int i = 1; i <= L; ++i) {
G[0].push_back(i);
//G[i].push_back(0);
C[0][i]++;
}
for (int j = 0; j < R; ++j) {
G[j + L + 1].push_back(N - 1);
//G[N - 1].push_back(j + L + 1);
C[j + L + 1][N - 1]++;
}
}
void printMatching() {
for (int i = 1; i <= L; ++i)
for (int j = 0; j != (int)G[i].size(); ++j)
if (C[G[i][j]][i]) {
printf("%d %d\n", i, G[i][j] - L);
break;
}
}
int main() {
_ = (int)freopen(InFile, "r", stdin);
_ = (int)freopen(OuFile, "w", stdout);
input();
printf("%d\n", Dinic());
printMatching();
return 0;
}