Pagini recente » Cod sursa (job #3361795) | Cod sursa (job #3361798) | Cod sursa (job #3361792) | Cod sursa (job #3362050) | Cod sursa (job #3361799)
/*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] == pas) return 0; //nu poate fi deranjat la acest pas
uz[worker] = pas;
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;
//incerc sa cuplez cum pot
for (int worker = 1; worker <= n; worker++) {
for (auto job : G[worker]) {
if (!dr[job]) {
st[worker] = job;
dr[job] = worker;
nrperechi++;
break;
}
}
}
for (int worker = 1; worker<=n; worker++) {
if (st[worker]) continue; //este cuplat
pas++;
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';
}
}
return 0;
}