Pagini recente » Istoria paginii utilizator/vladstoick | Istoria paginii problema/porcjoc | Diferente pentru documentatie/textile intre reviziile 107 si 11 | Profil Humiko | Cod sursa (job #1446670)
#include <fstream>
#include <iostream>
#include <vector>
#define NMAX 10001
using namespace std;
using Graph = vector<vector<int> >;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
Graph G(NMAX);
vector<bool> visited(NMAX);
vector<int> l(NMAX);
vector<int> r(NMAX);
bool pairup(int source)
{
if (visited[source]) return false;
visited[source] = true;
for (auto &node : G[source])
if (!r[node]) {
l[source] = node;
r[node] = source;
return true;
}
for (auto &node : G[source]) {
/* Ok, r[node] is coupled, let's try coupling different way */
if (pairup(r[node])) {
l[source] = node;
r[node] = source;
return true;
}
}
return false;
}
int main()
{
int N, M, E;
fin >> N >> M >> E;
int x, y;
for (int edge = 1; edge <= E; edge++) {
fin >> x >> y;
G[x].emplace_back(y);
}
int done = 0, CoupledEdges = 0;
while (!done) {
done = 1;
for (auto i = 1u; i < G.size(); i++)
if (!l[i] && pairup(i))
CoupledEdges++, done = 0;
for (auto i = 1u; i < G.size(); i++)
visited[i] = false;
}
fout << CoupledEdges << '\n';
for (auto i = 1u; i < G.size(); i++)
if (l[i])
fout << i << " " << l[i] << '\n';
return 0;
}