Pagini recente » Cod sursa (job #880595) | Cod sursa (job #1111299) | Cod sursa (job #2608778) | Cod sursa (job #3342923) | Cod sursa (job #3347558)
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 1e4 + 1;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E, solCuplaj;
int L[NMAX], R[NMAX];
bool viz[NMAX];
vector<int> G[NMAX];
void citire() {
int x, y;
fin >> N >> M >> E;
while(E--) {
fin >> x >> y;
G[x].push_back(y);
}
}
bool DFS(int x) {
if(viz[x]) return 0;
viz[x] = 1;
for(auto &y : G[x])
if(!R[y] || DFS(R[y])) {
L[x] = y;
R[y] = x;
return 1;
}
return 0;
}
void HK() { ///Hopcroft-Karp
bool amSchimbat = 1;
int i;
while(amSchimbat) {
amSchimbat = 0;
for(i = 1; i <= N; ++i)
viz[i] = 0;
for(i = 1; i <= N; ++i) {
if(!L[i] && DFS(i)) {
amSchimbat = 1;
++solCuplaj;
}
}
}
}
int main() {
citire();
HK();
fout << solCuplaj << '\n';
for(int i = 1; i <= N; ++i) {
if(L[i]) {
fout << i << ' ' << L[i] << '\n';
}
}
return 0;
}