Pagini recente » Cod sursa (job #1519367) | Rezultatele filtrării | Monitorul de evaluare | Kdtree | Cod sursa (job #1758099)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool pairup(const vector<vector<int>>& graph, vector<bool>& checked,
vector<int>& left, vector<int>& right, int node) {
if (checked[node]) {
return false;
}
checked[node] = true;
for (int adj : graph[node]) {
if (!right[adj]) {
left[node] = adj;
right[adj] = node;
return true;
}
}
for (int adj : graph[node]) {
if (pairup(graph, checked, left, right, right[adj])) {
left[node] = adj;
right[adj] = node;
return true;
}
}
return false;
}
int main() {
vector<vector<int>> graph;
vector<bool> checked;
vector<int> left, right;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, edges;
fin >> n >> m >> edges;
graph.resize(n + 1);
left.resize(n + 1);
right.resize(m + 1);
checked.resize(n + 1);
for (int e = 0; e < edges; ++e) {
int x, y;
fin >> x >> y;
graph[x].push_back(y);
}
for (bool change = true; change; ) {
change = false;
checked.assign(checked.size(), false);
for (int node = 1; node <= n; ++node)
if (!left[node]) {
change |= pairup(graph, checked, left, right, node);
}
}
int ans = 0;
for (int i = 1; i <= n; ++ i) {
ans += left[i] != 0;
}
fout << ans << "\n";
for (int i = 1; i <= n; ++ i)
if (left[i]) {
fout << i << " " << left[i] << "\n";
}
return 0;
}