Pagini recente » Cod sursa (job #634719) | Cod sursa (job #73900) | Cod sursa (job #3224589) | Cod sursa (job #658153) | Cod sursa (job #246474)
Cod sursa(job #246474)
#include <cstdio>
#include <vector>
using namespace std;
#define MAXN 10005
#define pb push_back
vector <int> lv[MAXN];
int N, M, E;
int d[MAXN], p[MAXN];
int viz[MAXN];
int iter;
void read () {
int a, b;
for (scanf ("%d %d %d", &N, &M, &E); E; -- E) {
scanf ("%d %d", &a, &b);
lv[a].pb(b);
}
}
int cuplaj (int n) {
if (viz[n] == iter)
return 0;
viz[n] = iter;
int sz = lv[n].size();
for (int i = 0; i < sz; ++ i)
if (!d[lv[n][i]]) {
d[lv[n][i]] = n;
p[n] = lv[n][i];
return 1;
} else if (cuplaj (d[lv[n][i]])) {
d[lv[n][i]] = n;
p[n] = lv[n][i];
return 1;
}
return 0;
}
void solve () {
bool ok = false;
while (!ok) {
ok = true;
++ iter;
for (int i = 1; i <= N; ++ i)
if (!p[i] && cuplaj (i)) {
ok = false;
++ iter;
}
}
int sol = 0;
for (int i = 1; i <= N; ++ i)
if (p[i]) ++ sol;
printf ("%d\n", sol);
for (int i = 1; i <= N; ++ i)
if (p[i]) printf ("%d %d\n", i, p[i]);
}
int main () {
freopen ("cuplaj.in", "r", stdin);
freopen ("cuplaj.out", "w", stdout);
read ();
solve ();
return 0;
}