Pagini recente » Cod sursa (job #3361798) | Cod sursa (job #3361792) | Cod sursa (job #3362050) | Cod sursa (job #3361799) | Cod sursa (job #3361791)
/*Cuplaj maxim in graf bipartit*/
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define NMAX 10001
int n,m,e;
vector<int> G[2*NMAX], st(2*NMAX,0), dr(2*NMAX,0);
vector<bool> uz(2*NMAX, 0);
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*/ ||
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;
job+=n;
G[worker].push_back(job);
G[job].push_back(worker);
}
int nrperechi = 0;
for (int worker = 1; worker<=n; worker++) {
if (st[worker]) continue; //este cuplat
if (cupleaza(worker)) { //incerc sa cuplez fara sa deranjez alte noduri
nrperechi++;
} else {
uz.assign(2*NMAX, 0);
if (cupleaza(worker)) { //incerc sa reorganizez
nrperechi++;
}
}
}
fout << nrperechi << '\n';
for (int i = 1; i<=n; i++) {
if (st[i]) {
fout << i << ' ' << st[i]-n << '\n';
}
}
return 0;
}