Pagini recente » Cod sursa (job #1730309) | Cod sursa (job #1929797) | Cod sursa (job #548478) | Cod sursa (job #3267118) | Cod sursa (job #459673)
Cod sursa(job #459673)
#include <stdio.h>
#include <string.h>
char buff[8192];
FILE *fin;
FILE *fout;
#define Nmax 10100
#define Emax 200100 + Nmax
int l[Emax];
int next[Emax];
int last[Nmax];
int next_free;
void init_list() {
memset(l, 0, sizeof l);
memset(next, 0, sizeof next);
next_free = Nmax;
int i;
for (i = 0; i < Nmax; ++i)
last[i] = i;
}
inline void push(int A, int B) {
l[last[A]] = B;
next[last[A]] = ++next_free;
last[A] = next_free;
}
int N,M,E;
int st[Nmax];
int dr[Nmax];
char viz[Nmax];
char cupleaza(int nod) {
if (viz[nod])
return 0;
viz[nod] = 1;
if (l[nod] == 0)
return 0;
int it;
for (it = nod; it != last[nod]; it = next[it])
if (dr[l[it]] == 0) {
st[nod] = l[it];
dr[l[it]] = nod;
return 1;
}
for (it = nod; it != last[nod]; it = next[it])
if (cupleaza(dr[l[it]])) {
st[nod] = l[it];
dr[l[it]] = nod;
return 1;
}
return 0;
}
void solve() {
fscanf(fin, "%d%d%d", &M, &N, &E);
init_list();
int i, a, b;
for (i = 0; i < E; ++i) {
fscanf(fin, "%d%d", &a, &b);
push(a,b);
}
memset(st, 0, sizeof st);
memset(dr, 0, sizeof dr);
char ok = 1;
while (ok) {
ok = 0;
memset(viz, 0, sizeof viz);
int i;
for (i = 1; i <= M; ++i)
ok |= cupleaza(i);
}
int ret = 0;
for (i = 1; i <= M; ++i)
if (st[i])
++ret;
fprintf(fout , "%d\n", ret);
for (i = 1; i <= M; ++i)
if (st[i])
fprintf(fout, "%d %d\n", i, st[i]);
}
int main() {
fin = fopen("cuplaj.in" , "r");
fout = fopen("cuplaj.out", "w");
setbuf(fin, buff);
solve();
fclose(fin);
fclose(fout);
return 0;
}