Pagini recente » Cod sursa (job #959382) | Cod sursa (job #2778382) | Cod sursa (job #2959555) | Cod sursa (job #467823) | Cod sursa (job #3257694)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
#include <climits>
#include <cstring>
using namespace std;
const int MAXN = 1005;
vector<int> adj[MAXN];
int dist[MAXN];
int matchL[MAXN], matchR[MAXN];
int NIL = 0;
bool bfs(int N) {
queue<int> q;
for (int u = 1; u <= N; u++) {
if (matchL[u] == NIL) {
dist[u] = 0;
q.push(u);
} else {
dist[u] = INT_MAX;
}
}
dist[NIL] = INT_MAX;
while (!q.empty()) {
int u = q.front();
q.pop();
if (dist[u] < dist[NIL]) {
for (int v : adj[u]) {
if (dist[matchR[v]] == INT_MAX) {
dist[matchR[v]] = dist[u] + 1;
q.push(matchR[v]);
}
}
}
}
return dist[NIL] != INT_MAX;
}
bool dfs(int u) {
if (u != NIL) {
for (int v : adj[u]) {
if (dist[matchR[v]] == dist[u] + 1 && dfs(matchR[v])) {
matchL[u] = v;
matchR[v] = u;
return true;
}
}
dist[u] = INT_MAX;
return false;
}
return true;
}
int hopcroftKarp(int N, int M) {
int maxMatching = 0;
for (int i = 0; i <= N; i++) matchL[i] = NIL;
for (int i = 0; i <= M; i++) matchR[i] = NIL;
while (bfs(N)) {
for (int u = 1; u <= N; u++) {
if (matchL[u] == NIL && dfs(u)) {
maxMatching++;
}
}
}
return maxMatching;
}
int main() {
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
fin >> N >> M >> E;
for (int i = 0; i < E; i++) {
int u, v;
fin >> u >> v;
adj[u].push_back(v);
}
int maxMatching = hopcroftKarp(N, M);
fout << maxMatching << "\n";
for (int u = 1; u <= N; u++) {
if (matchL[u] != NIL) {
fout << u << " " << matchL[u] << "\n";
}
}
return 0;
}