Pagini recente » Cod sursa (job #1943208) | Cod sursa (job #3267477) | Cod sursa (job #555957) | Cod sursa (job #2032963) | Cod sursa (job #228401)
Cod sursa(job #228401)
#include <stdio.h>
#include <vector>
#include <assert.h>
#include <set>
using namespace std;
#define maxn 10010
int n, m, e, draw, sol;
vector <int> a[maxn];
int g[maxn];
int u[maxn], mark[maxn], c[maxn];
// set < pair <int, int > > S;
int DFS(int nod)
{
if (u[nod]==draw) return 0;
u[nod] = draw;
int i;
for (i=0; i<g[nod]; i++)
if (mark[a[nod][i]]==-1 || DFS(mark[a[nod][i]]))
{
c[nod] = a[nod][i];
mark[a[nod][i]] = nod;
return 1;
}
return 0;
}
void cuplaj()
{
memset(mark, -1, sizeof(mark));
int last = -1, i;
while (last != sol)
{
last = sol;
draw++;
for (i=1; i<=n; i++)
if (!c[i]) sol += DFS(i);
}
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int i, x, y;
scanf("%d %d %d ", &n, &m, &e);
assert(1 <= n && n <= 10000);
assert(1 <= m && m <= 10000);
assert(1 <= e && e <= 100000 && e <= n*m);
for (i=1; i<=e; i++)
{
scanf("%d %d ", &x, &y);
assert(1 <= x && x <= n);
assert(1 <= y && y <= m);
a[x].push_back(y);
// assert(S.find( make_pair(x, y)) == S.end());
// S.insert( make_pair(x, y));
}
for (i=1; i<=n; i++) g[i] = a[i].size();
cuplaj();
printf("%d\n", sol);
for (i=1; i<=n; i++)
if (c[i]) printf("%d %d\n", i, c[i]);
return 0;
}