Pagini recente » Cod sursa (job #472312) | Cod sursa (job #350300) | Cod sursa (job #2802226) | Cod sursa (job #1841560) | Cod sursa (job #2134688)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int nMax= 10003;
int n, m, lf[nMax], rg[nMax], ans;
/**
* lf[i] = nodul cu care se cupleaza nodul i din B
* rg[i] = nodul cu care se cupleaza nodul i din A
* ans = numarul de muchii din cuplajul maxim
*/
bool used[nMax];
/**
* used[i] = 1 daca nodul i din lfanga e cuplat
*/
vector <int> L[nMax];
void Read() {
int e, x, y;
fin >> n >> m >> e;
while (e--) {
fin >> x >> y;
L[x].push_back(y);
}
}
/**
* incerc sa cuplez nodul k
* return 1 daca reusesc sau 0 daca nu
*/
bool Match(int k) {
if (used[k]) return false;
used[k] = 1;
for (auto i : L[k]) {
if (rg[i] == 0) {
lf[k] = i;
rg[i] = k;
return true;
}
}
/**
* n-am reusit sa-l cuplez pe k, deci mai parcurg o data L[k]
* si poate reusesc sa-l cuplez pe k cu un nod cuplat
*/
for (auto i : L[k]) {
if (Match(rg[i])) {
lf[k] = i;
rg[i] = k;
return true;
}
}
return false;
}
void Solve() {
int i;
bool done = false;
while (!done) {
done = true;
for (i = 1; i <= n; i++)
used[i] = 0;
for (i = 1; i <= n; i++) {
if (lf[i] == 0 && Match(i)) {
ans++;
done = 0;
}
}
}
fout << ans << "\n";
for (i = 1; i <= n; i++) {
if(lf[i]) {
fout << i << " " << lf[i] << "\n";
}
}
}
int main() {
Read();
Solve();
return 0;
}