Pagini recente » Cod sursa (job #2523742) | Cod sursa (job #2761019) | Cod sursa (job #1597858) | Cod sursa (job #2956533) | Cod sursa (job #2496572)
#include <fstream>
#include <vector>
using namespace std;
char const *in_file = "cuplaj.in";
char const *out_file = "cuplaj.out";
ifstream Read(in_file);
ofstream Write(out_file);
void ReadInput(
vector<vector<uint32_t>> &nodes
) {
uint32_t n;
uint32_t m;
uint32_t e;
Read >> n;
Read >> m;
Read >> e;
nodes.resize(max(n, m));
uint32_t node1;
uint32_t node2;
for (uint32_t i = 0; i < e; ++i) {
Read >> node1;
Read >> node2;
nodes[node1 - 1].push_back(node2 - 1);
}
}
bool DFS(
vector<vector<uint32_t>> const &nodes,
vector<int32_t> &to,
vector<int32_t> &from,
vector<bool> &vis,
uint32_t const node
) {
if (vis[node]) {
return false;
}
vis[node] = true;
uint32_t to_node;
for (uint32_t i = 0; i < nodes[node].size(); ++i) {
to_node = nodes[node][i];
if (from[to_node] == -1 ||
DFS(nodes, to, from, vis, from[to_node])
) {
to[node] = to_node;
from[to_node] = node;
return true;
}
}
return false;
}
void Solve(
vector<vector<uint32_t>> const &nodes
) {
vector<int32_t> to(nodes.size(), -1);
vector<int32_t> from(nodes.size(), -1);
vector<bool> vis(nodes.size());
bool found;
uint32_t i;
do {
found = false;
fill(vis.begin(), vis.end(), false);
for (i = 0; i < nodes.size(); ++i) {
if (to[i] == -1) {
found |= DFS(nodes, to, from, vis, i);
}
}
} while (found);
uint32_t _count = 0;
for (i = 0; i < nodes.size(); ++i) {
if (to[i] != -1) {
++_count;
}
}
Write << _count << '\n';
for (i = 0; i < nodes.size(); ++i) {
if (to[i] != -1) {
Write << i + 1 << ' ';
Write << to[i] + 1 << '\n';
}
}
}
int main() {
vector<vector<uint32_t>> nodes;
ReadInput(nodes);
Solve(nodes);
Read.close();
Write.close();
return 0;
}