Pagini recente » Cod sursa (job #1002513) | Cod sursa (job #1518410) | Cod sursa (job #2485401) | Cod sursa (job #2277902) | Cod sursa (job #1246478)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 10001
int left[NMAX],right[NMAX];
int E,N,M,X,Y,w,i;
bool marked[NMAX];
vector < int > G[NMAX];
bool can(int node)
{
if (marked[node]) return false;
marked[node]=true;
for (vector < int > :: iterator u=G[node].begin();u!=G[node].end();++u)
if (!right[*u])
{
left[node]=*u;
right[*u]=node;
return true;
}
for (vector < int > :: iterator u=G[node].begin();u!=G[node].end();++u)
if (can(right[*u]))
{
left[node]=*u;
right[*u]=node;
return true;
}
return false;
}
void Cuplaj()
{
int i,flag=true;
for (;flag;)
{
flag=false;
memset(marked,false,sizeof(marked));
for (i=1;i<=N;++i)
if (!left[i]) flag|=can(i);
}
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
for (scanf("%d%d%d",&N,&M,&E);E;--E)
{
scanf("%d%d",&X,&Y);
G[X].push_back(Y);
}
Cuplaj();
for (i=1;i<=N;++i) w+=(left[i]>0);
for (i=1,printf("%d\n",w);i<=N;++i)
if (left[i]) printf("%d %d\n",i,left[i]);
return 0;
}