Pagini recente » Cod sursa (job #431628) | Cod sursa (job #1493869) | Cod sursa (job #2998984) | Cod sursa (job #1766499) | Cod sursa (job #1246449)
#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)
{
int i;
if (marked[node]) return false;
marked[node]=true;
for (vector < int > :: iterator u=G[node].begin();u!=G[node].end();++u)
if (!right[*u] || can(right[*u]))
{
left[node]=*u;
right[*u]=node;
return true;
}
return false;
}
void Cuplaj()
{
int i;
for (i=1;i<=N;++i)
{
if (left[i]) continue;
if (can(i)) ++w;
else {
memset(marked,0,sizeof(marked));
if (can(i)) ++w;
}
}
}
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,printf("%d\n",w);i<=N;++i)
if (left[i]) printf("%d %d\n",i,left[i]);
return 0;
}