Pagini recente » Cod sursa (job #1585649) | Cod sursa (job #1304704) | Cod sursa (job #2443970) | Cod sursa (job #868969) | Cod sursa (job #301348)
Cod sursa(job #301348)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N_MAX = 100001;
int n,m,e, rez;
bool view[N_MAX];
int cuplaj[N_MAX];
bool cupla[N_MAX];
vector<int> G[N_MAX];
int pair_up ( int nod ) {
if (view[nod])
return 0;
view[nod] = true;
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
if (!cuplaj[*it]) {
cuplaj[*it] = nod;
return 1;
}
}
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
if (cuplaj[*it] && cuplaj[*it] != nod && pair_up(cuplaj[*it])) {
cuplaj[*it] = nod;
return 1;
}
}
return 0;
}
int main() {
freopen("cuplaj.in","rt",stdin);
freopen("cuplaj.out","wt",stdout);
scanf("%d %d %d",&n,&m,&e);
for (int i = 0, a,b; i < e; ++i) {
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
bool ok = true;
while (ok) {
memset(view,0,sizeof(view));
ok = false;
for (int i = 1; i <= n; ++i) {
if (!cupla[i] && pair_up(i)) {
cupla[i] = true;
++rez;
ok = true;
}
}
}
printf("%d\n",rez);
for (int i = 1; i <= m; ++i)
if (cuplaj[i])
printf("%d %d\n",cuplaj[i],i);
return 0;
}