Pagini recente » Cod sursa (job #2567702) | Cod sursa (job #1466365) | Cod sursa (job #1251420) | Cod sursa (job #2478182) | Cod sursa (job #2134687)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int nMax = 10005;
int St[nMax], Dr[nMax];
///st - cuplez i cu B
///dr - cuplez i cu A
vector <int> G[nMax];
int viz[nMax]; ///daca nodul i din stanga este cuplat
inline int Cupleaza(int k) {
if(viz[k] == 1) {
return false;
}
viz[k] = 1;
for(const auto& v : G[k]) {
if(Dr[v] == 0) {
St[k] = v;
Dr[v] = k;
return true;
}
}
for(const auto& v : G[k]) {
if(Cupleaza(Dr[v])) {
St[k] = v;
Dr[v] = k;
return true;
}
}
return false;
}
inline int Solve(int n) {
int ok = false;
int lng = 0;
while(!ok) {
ok = true;
for(int i = 1; i <= n; i++) {
viz[i] = 0;
}
for(int i = 1; i <= n; i++) {
if(St[i] == 0 && Cupleaza(i)) {
lng++;
ok = false;
}
}
}
return lng;
}
int main()
{
int n, m, e, ans = 0, x, y;
f >> n >> m >> e;
for(int i = 1; i <= e; i++) {
f >> x >> y;
G[x].push_back(y);
}
ans = Solve(n);
g << ans << "\n";
for(int i = 1; i <= n; i++) {
if(St[i] != 0) {
g << i << " " << St[i] << "\n";
}
}
return 0;
}