Pagini recente » Cod sursa (job #3154862) | Cod sursa (job #673021) | Cod sursa (job #660902) | Cod sursa (job #1833010) | Cod sursa (job #3231563)
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
#include <fstream>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int MAXN = 10001;
vector<int> adj[MAXN];
int pairU[MAXN], pairV[MAXN], dist[MAXN];
bool bfs(int N) {
queue<int> Q;
for (int u = 1; u <= N; u++) {
if (pairU[u] == 0) {
dist[u] = 0;
Q.push(u);
} else {
dist[u] = INT_MAX;
}
}
dist[0] = INT_MAX;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
if (dist[u] < dist[0]) {
for (int v : adj[u]) {
if (dist[pairV[v]] == INT_MAX) {
dist[pairV[v]] = dist[u] + 1;
Q.push(pairV[v]);
}
}
}
}
return dist[0] != INT_MAX;
}
bool dfs(int u) {
if (u != 0) {
for (int v : adj[u]) {
if (dist[pairV[v]] == dist[u] + 1) {
if (dfs(pairV[v])) {
pairV[v] = u;
pairU[u] = v;
return true;
}
}
}
dist[u] = INT_MAX;
return false;
}
return true;
}
int alg(int N, int M) {
memset(pairU, 0, sizeof(pairU));
memset(pairV, 0, sizeof(pairV));
int matching = 0;
while (bfs(N)) {
for (int u = 1; u <= N; u++)
if (pairU[u] == 0 && dfs(u))
matching++;
}
return matching;
}
int main() {
int N, M, E;
in >> N >> M >> E;
for (int i = 0, u, v; i < E; i++) {
in >> u >> v;
adj[u].push_back(v);
}
int maxMatching = alg(N, M);
out << maxMatching << endl;
for (int u = 1; u <= N; u++)
if (pairU[u] != 0)
out << u << " " << pairU[u] << endl;
return 0;
}