Pagini recente » Cod sursa (job #2831050) | Cod sursa (job #685959) | Cod sursa (job #3159825) | Cod sursa (job #1510847) | Cod sursa (job #2208132)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("cuplaj.in");
ofstream g ("cuplaj.out");
const int NMAX = 1e4;
vector <int> adj[NMAX];
int used[NMAX];
int match1[NMAX], match2[NMAX];
bool match (int node) {
if (used[node]) {
return false;
}
used[node] = 1;
for (auto &i : adj[node]) {
if (match2[i] == -1) {
match2[i] = node;
match1[node] = i;
return true;
}
}
for (auto &i : adj[node]) {
if (match(match2[i])) {
match1[node] = i;
match2[i] = node;
return true;
}
}
return false;
}
int main() {
int n, m, e;
f >> n >> m >> e;
for (int i = 0; i < e; ++i) {
int u, v;
f >> u >> v;
--u; --v;
adj[u].push_back(v);
}
memset (match1, -1, sizeof(match1));
memset (match2, -1, sizeof(match2));
bool wasChanged = true;
while (wasChanged) {
wasChanged = false;
memset (used, 0, sizeof(used));
for (int i = 0; i < n; ++i) {
if (match1[i] == -1 && match(i)) {
wasChanged = true;
}
}
}
int numOfMatches = 0;
for (int i = 0; i < n; ++i) {
if (match1[i] != -1) {
++numOfMatches;
}
}
g << numOfMatches << '\n';
for (int i = 0; i < n; ++i) {
if (match1[i] != -1) {
g << i + 1 << ' ' << match1[i] + 1 << '\n';
}
}
f.close();
g.close();
return 0;
}