Pagini recente » Cod sursa (job #1962642) | Cod sursa (job #2706722) | Cod sursa (job #554438) | Rating aaaa vvvv (holler) | Cod sursa (job #1758247)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 10001
vector<int> A[NMAX];
int vecinInA[NMAX];
int vecinInB[NMAX];
vector<bool> vizitat(NMAX);
vector< pair<int, int> > aflaCuplajMaxim(int n);
bool cupleaza(int nod);
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, k;
fin >> n >> m >> k;
while (k--) {
int x, y;
fin >> x >> y;
A[x].push_back(y);
}
auto cuplaj = aflaCuplajMaxim(n);
fout << cuplaj.size() << "\n";
for (auto muchie : cuplaj)
fout << muchie.first << " " << muchie.second << "\n";
return 0;
}
vector< pair<int, int> > aflaCuplajMaxim(int n)
{
bool cuplajNou;
do {
cuplajNou = false;
for (int i = 1; i <= n; ++i) {
if (!vecinInB[i] && cupleaza(i))
cuplajNou = true;
}
if (cuplajNou) {
for (int i = 1; i <= n; ++i)
vizitat[i] = false;
}
} while (cuplajNou);
vector< pair<int, int> > sol;
for (int i = 1; i <= n; ++i) {
if (vecinInB[i])
sol.push_back({i, vecinInB[i]});
}
return sol;
}
bool cupleaza(int nod)
{
if (vizitat[nod])
return false;
vizitat[nod] = true;
for (int v : A[nod]) {
if (!vecinInA[v]) {
vecinInB[nod] = v;
vecinInA[v] = nod;
return true;
}
}
for (int v : A[nod]) {
if (cupleaza(vecinInA[v])) {
vecinInB[nod] = v;
vecinInA[v] = nod;
return true;
}
}
return false;
}