Pagini recente » Trondheim - sau de ce sa investesti in educatie | Autentificare | Borderou de evaluare (job #3361800) | Cod sursa (job #3362051) | Cod sursa (job #3361800)
/*Cuplaj maxim in graf bipartit*/
#include<iostream>
#include<vector>
#include<fstream>
#include <string.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define NMAX 10001
int n,m,e;
vector<int> G[NMAX], st(NMAX,0), dr(NMAX,0);
int uz[NMAX];
int pas = 1;
bool cupleaza(int worker) {
if (uz[worker]) return 0; //nu poate fi deranjat
uz[worker] = 1;
for (auto job: G[worker]) {
if (!dr[job] /*nu este cuplat*/) {
dr[job] = worker;
st[worker] = job;
return 1;
}
}
for (auto job: G[worker]) {
if (cupleaza(dr[job]) /*perechea lui poate fi recuplata*/) {
dr[job] = worker;
st[worker] = job;
return 1;
}
}
return 0;
}
int main() {
fin >> n >> m >> e;
while (e--) {
int worker,job; fin >> worker >> job;
G[worker].push_back(job);
}
int nrperechi = 0;
bool ok = 1;
while (ok) { //cat timp cuplajul se mai poate modifica
memset(uz, 0, sizeof(uz));
ok = 0;
for (int worker = 1; worker<=n; worker++) {
if (st[worker]) continue;
if (cupleaza(worker)) {
ok = 1;
nrperechi++; //am mai cuplat pe cineva
}
}
}
fout << nrperechi << '\n';
for (int i = 1; i<=n; i++) {
if (st[i]) {
fout << i << ' ' << st[i] << '\n';
}
}
return 0;
}