Pagini recente » Links | Cod sursa (job #1118040) | Statisticile problemei Nc | Cod sursa (job #1091714) | Cod sursa (job #455589)
Cod sursa(job #455589)
#include <iostream>
#include <vector>
using namespace std;
#define NMAX 10010
#define MMAX 10010
int N, M, T, cnt;
vector<int> g[NMAX];
int l[NMAX], r[MMAX], u[NMAX];
char mat[NMAX][MMAX];
int pairup(int nod, int constraint)
{
if (u[nod])
return 0;
u[nod] = 1;
for (int i = 0; i < g[nod].size(); ++i)
if ( g[nod][i] != constraint && !r[ g[nod][i] ] )
{
l[ nod ] = g[nod][i];
r[ g[nod][i] ] = nod;
return 1;
}
for (int i = 0; i < g[nod].size(); ++i)
if ( g[nod][i] != constraint && pairup(r[ g[nod][i] ], 0) )
{
l[ nod ] = g[nod][i];
r[ g[nod][i] ] = nod;
return 1;
}
return 0;
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
cin >> N >> M >> T;
for (int i = 1; i <= T; ++i)
{
int x, y;
cin >> x >> y;
g[x].push_back(y);
}
for (int i = 1; i <= N; ++i)
if ( !l[i] )
{
if (!pairup(i,0))
{
memset(u, 0, sizeof(u));
cnt += pairup(i,0);
}
else
++cnt;
}
cout << cnt << "\n";
for (int i = 1; i <= N; ++i)
if ( l[i] )
{
cout << i << " " << l[i] << "\n";
}
return 0;
}