Pagini recente » Cod sursa (job #565246) | Cod sursa (job #1936735) | Cod sursa (job #2500248) | Cod sursa (job #1557603) | Cod sursa (job #901027)
Cod sursa(job #901027)
#include <cstdio>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
//const char iname[] = "cuplaj.in";
//const char oname[] = "cuplaj.out";
#define MAXN 10005
#define FOR(i, a, b) for (int i = (int)(a); i <= (int)(b); ++ i)
#define FORI(i, V) for (vector <int>::iterator i = (V).begin(); i != (V).end(); ++ i)
vector <int> G[MAXN];
int l[MAXN], r[MAXN], u[MAXN];
int pairup(const int n)
{
if (u[n]) return 0;
u[n] = 1;
FORI (i, G[n]) if (!r[*i]) {
l[n] = *i;
r[*i] = n;
return 1;
}
FORI (i, G[n]) if (pairup(r[*i])) {
l[n] = *i;
r[*i] = n;
return 1;
}
return 0;
}
int main(void)
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int n, m, cnt_edges,j;
scanf("%d %d %d", &n, &m, &cnt_edges);
for (; cnt_edges --; )
{
int x, y;
scanf("%d %d", &x, &y);
G[x].push_back(y);
}
int cuplaj = 0;
FOR (i, 1, n) if (!l[i]) {
if (!pairup(i)) {
memset(u, 0, sizeof(u)); //cu asta i-au 80 p...trebuie inclus string.h
// for(j=0;j<=n;j++) cu asta luam 20 p, si pe restul testelor Raspuns Gresit
//u[i]=0;
cuplaj += pairup(i);
}
else
cuplaj ++;
}
printf("%d\n", cuplaj);
FOR (i, 1, n) if (l[i] > 0)
printf("%d %d\n", i, l[i]);
return 0;
}