Pagini recente » Cod sursa (job #1631311) | Cod sursa (job #1213578) | Cod sursa (job #462150) | Cod sursa (job #1673628) | Cod sursa (job #1620597)
///Problema Cuplaj - InfoArena ( www.infoarena.ro/problema/cuplaj )
#include <cstdio>
#include <vector>
#include <cstring>
#define in "cuplaj.in"
#define out "cuplaj.out"
#define NMAX 10007
#define pb push_back
using namespace std;
int n, m, E, viz[NMAX], ok = 1, sol[2][NMAX], sum;
vector <int> g[2][NMAX];
bool cuplez(const int &nod)
{
int sze = g[0][nod].size();
if(viz[nod]) return 0;
viz[nod] = 1;
for(int i =0; i< sze; ++i)
{
int tmp = g[0][nod][i];
if(sol[1][tmp]) continue;
sol[0][nod] = tmp;
sol[1][tmp] = nod;
return 1;
}
for(int i =0; i< sze; ++i)
{
int tmp = g[0][nod][i];
if(!cuplez(sol[1][tmp])) continue;
sol[0][nod] = tmp;
sol[1][tmp] = nod;
return 1;
}
return 0;
}
inline void citire()
{
int nod1, nod2;
scanf("%d %d %d", &n, &m, &E);
for(int i = 1; i<= E; ++i)
{
scanf("%d %d", &nod1, &nod2);
g[0][nod1].pb(nod2);
g[1][nod2].pb(nod1);
}
}
inline void solve()
{
while(ok)
{
ok = 0;
memset(viz, 0, sizeof(viz));
for(int i = 1; i<= n; ++i)
{
if(sol[0][i]) continue;
if(cuplez(i))
{
++sum;
ok = 1;
}
}
}
}
inline void afisare()
{
printf("%d\n", sum);
for(int i = 1; i<= n; ++i)
{
if(sol[0][i]) printf("%d %d\n", i, sol[0][i]);
}
}
int main()
{
freopen(in, "r", stdin);
freopen(out, "w", stdout);
citire();
solve();
afisare();
return 0;
}