Pagini recente » Cod sursa (job #1365613) | Cod sursa (job #2709141) | Cod sursa (job #1100918) | Cod sursa (job #685043) | Cod sursa (job #441612)
Cod sursa(job #441612)
// Simionescu Andrei, -/-/2010
// http://infoarena.ro/problema/cuplaj
// Dificultate: -
// Categorii: -
#include <cstdio>
#include <string>
#include <vector>
using namespace std;
#define NMAX 10005
int n, m, M, L[NMAX], R[NMAX], visited[NMAX];
vector<int> graf[NMAX];
void input();
int pairup(int);
void solve();
int main(){
freopen( "cuplaj.in", "r", stdin );
freopen( "cuplaj.out", "w", stdout );
input();
solve();
return 0;
}
void input()
{
scanf( "%d %d %d", &n, &m, &M);
int x, y;
for(; M; --M )
{
scanf("%d %d", &x, &y);
graf[x].push_back(y);
}
}
int pairup(int nod)
{
if(visited[nod])
return 0;
visited[nod] = 1;
for(int i = 0; i < graf[nod].size(); ++i)
if( !R[graf[nod][i]] )
{
L[nod] = graf[nod][i];
R[graf[nod][i]] = nod;
return 1;
}
for(int i = 0; i < graf[nod].size(); ++i )
if( pairup(R[graf[nod][i]]) )
{
R[graf[nod][i]] = nod;
L[nod] = graf[nod][i];
return 1;
}
return 0;
}
void solve()
{
int ok = 0, cuplaj = 0;
do{
ok = 0;
memset(visited, 0, sizeof(visited));
for(int i = 1; i <= n; ++i)
if(!L[i] && pairup(i))
{
++cuplaj;
ok = 1;
}
} while(ok);
printf("%d\n", cuplaj);
for(int i = 1; i <= n; ++i)
if( L[i] )
printf("%d %d\n", i, L[i]);
}