Pagini recente » Cod sursa (job #1813725) | Cod sursa (job #341873) | Cod sursa (job #2006651) | Cod sursa (job #418022) | Cod sursa (job #1494580)
#include <fstream>
#include <vector>
#include <bitset>
#define DIM 10010
using namespace std;
vector<int> V[DIM];
int L[DIM], R[DIM], n, m, k, i, ok, x, y, sol;
//L[i] = vecinul din dreapta din cuplaj al jodului i din stanga sau 0 daca nodul i nu e cuplat
//R[i] = vecinul din stanga din cuplaj al jodului i din dreapta sau 0 daca nodul i nu e cuplat
bitset<DIM> U;
int cupleaza(int nod) {
// incerc sa cuplez pe nod (aflat inb stanga si necuplat cu cineva)
// incerc sa cuplez pe nod direct cu un element din
if (U[nod] == 1)
return 0;
U[nod] = 1;
int it;
for (int i=0;i<V[nod].size();i++) {
it = V[nod][i];
if (R[it] == 0) {
L[nod] = it;
R[it] = nod;
sol++;
return 1;
}
}
for (int i=0;i<V[nod].size();i++) {
// sigur R[*it] e nenul
it = V[nod][i];
if (cupleaza(R[it])) {
L[nod] = it;
R[it] = nod;
return 1;
}
}
return 0;
}
int main () {
ifstream fin ("cuplaj.in");
ofstream fout("cuplaj.out");
fin>>n>>m>>k;
for (i=1;i<=k;i++) {
fin>>x>>y;
V[x].push_back(y);
}
do {
ok = 0;
U.reset();
for (i=1;i<=n;i++)
if (L[i] == 0) {
ok = ok || cupleaza(i);
}
} while (ok == 1);
fout<<sol<<"\n";
for (i=1;i<=n;i++)
if (L[i] != 0)
fout<<i<<" "<<L[i]<<"\n";
return 0;
}