Pagini recente » Arhiva Educationala | Arhiva Educationala | Arhiva Educationala | Arhiva Educationala | Cod sursa (job #3289687)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
vector <int> l[10005], r[10005];
int cupl[10005], cupr[10005];
bool viz[10005];
bool cupleaza (int nod)
{
if (viz[nod]) return 0;
viz[nod]=1;
for (int vecin : l[nod]) {
if (cupr[vecin]==0) {
cupr[vecin]=nod;
cupl[nod] = vecin;
return 1;
}
else {
bool ans = cupleaza(cupr[vecin]);
if (ans) {
cupr[vecin]=nod;
cupl[nod] = vecin;
return 1;
}
}
}
return 0;
}
int main()
{
fin.tie(0); fin.sync_with_stdio(false);
int n, m, e; fin>>n>>m>>e;
for (int i=1; i<=e; i++) {
int a, b; fin>>a>>b;
l[a].push_back(b); r[b].push_back(a);
}
bool am_cuplat = 0;
do {
am_cuplat = 0;
memset(viz, 0, sizeof(viz));
for (int i=1; i<=n; i++) {
if (cupl[i]==0) {
am_cuplat = am_cuplat | cupleaza(i);
}
}
} while (am_cuplat);
int cnt = 0;
for (int i=1; i<=n; i++) {
if (cupl[i]) cnt++;
}
fout<<cnt<<'\n';
for (int i=1; i<=n; i++) {
if (cupl[i]) {
fout<<i<<' '<<cupl[i]<<'\n';
}
}
return 0;
}