Pagini recente » Cod sursa (job #2658572) | Cod sursa (job #1516304) | Cod sursa (job #920227) | Cod sursa (job #1097086) | Cod sursa (job #3233310)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <cstring>
using namespace std;
const int MAXN = 10000;
vector<int> adj[MAXN + 1];
int pairU[MAXN + 1], pairV[MAXN + 1], dist[MAXN + 1];
int N, M, E;
bool bfs() {
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 && dfs(pairV[v])) {
pairV[v] = u;
pairU[u] = v;
return true;
}
}
dist[u] = INT_MAX;
return false;
}
return true;
}
int hopcroftKarp() {
memset(pairU, 0, sizeof(pairU));
memset(pairV, 0, sizeof(pairV));
memset(dist, 0, sizeof(dist));
int matching = 0;
while (bfs()) {
for (int u = 1; u <= N; ++u) {
if (pairU[u] == 0 && dfs(u)) {
++matching;
}
}
}
return matching;
}
int main() {
ifstream infile("cuplaj.in");
ofstream outfile("cuplaj.out");
infile >> N >> M >> E;
for (int i = 0; i < E; ++i) {
int u, v;
infile >> u >> v;
adj[u].push_back(v);
}
int maxMatching = hopcroftKarp();
outfile << maxMatching << endl;
for (int u = 1; u <= N; ++u) {
if (pairU[u] != 0) {
outfile << u << " " << pairU[u] << endl;
}
}
infile.close();
outfile.close();
return 0;
}