Pagini recente » Cod sursa (job #1464497) | Cod sursa (job #592931) | Monitorul de evaluare | Cod sursa (job #928598) | Cod sursa (job #1210711)
#include <fstream>
#include <vector>
#define DIM 100010
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> V[DIM];
int L[DIM], R[DIM], U[DIM], nr, ok, i, n, m, k, x, y;
//L[i] = perechea din dreapta a nodului i din stanga
//R[i] = perechea din stanga a elemenrului i din dreapta
int cupleaza(int nod) {
if (U[nod] == 1)
return 0;
U[nod] = 1;
for (int i=0;i<V[nod].size();i++)
if ( R[ V[nod][i] ] == 0 ) {
L[nod] = V[nod][i];
R[ V[nod][i] ] = nod;
nr++;
return 1;
}
for (int i=0;i<V[nod].size();i++)
if ( cupleaza(R[ V[nod][i] ]) ) {
L[nod] = V[nod][i];
R[ V[nod][i] ] = nod;
return 1;
}
return 0;
}
int main() {
fin>>n>>m>>k;
for (i=1;i<=k;i++) {
fin>>x>>y;
V[x].push_back(y);
}
do {
ok = 0;
for (i=1;i<=n;i++)
U[i] = 0;
for (i=1;i<=n;i++)
if (L[i] == 0 && cupleaza(i))
ok = 1;
} while (ok);
fout<<nr<<"\n";
for (i=1;i<=n;i++)
if (L[i])
fout<<i<<" "<<L[i]<<"\n";
return 0;
}