Pagini recente » Cod sursa (job #1787262) | Cod sursa (job #2461298) | Cod sursa (job #2641085) | Cod sursa (job #3204514) | Cod sursa (job #2253646)
#include <fstream>
#include <vector>
#define NMAX 10002
int n1, n2, m;
std::vector <int> g1[NMAX], g2[NMAX];
int leftPartner[NMAX], rightPartner[NMAX];
void readInput() {
std::ifstream fin("cuplaj.in");
fin >> n1 >> n2 >> m;
for (int i = 0; i < m; i++) {
int node1, node2;
fin >> node1 >> node2;
g1[node1].push_back(node2);
g2[node2].push_back(node1);
}
fin.close();
}
bool pairThem(const int&node) {
for(auto const& next: g1[node])
if (!leftPartner[next]) {
rightPartner[node] = next;
leftPartner[next] = node;
return true;
}
for(auto const& next: g1[node])
if (leftPartner[next] != node && pairThem(leftPartner[next])) {
rightPartner[node] = next;
leftPartner[next] = node;
return true;
}
return false;
}
void coupleIt() {
bool better = true;
while (better) {
better = false;
for (int i = 1; i <= n1; i++)
better |= pairThem(i);
}
}
void output() {
int total = 0;
for (int i = 1; i <= n1; i++)
if (rightPartner[i])
total++;
std::ofstream fout("cuplaj.out");
fout << total << '\n';
for (int i = 1; i <= n1; i++)
if (rightPartner[i])
fout << i << ' ' << rightPartner[i] << '\n';
fout.close();
}
int main() {
readInput();
coupleIt();
output();
return 0;
}