Pagini recente » Cod sursa (job #622603) | Cod sursa (job #1671504) | Cod sursa (job #2244775) | Cod sursa (job #2722688) | Cod sursa (job #584895)
Cod sursa(job #584895)
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMax 10010
using namespace std;
const char IN[]="cuplaj.in",OUT[]="cuplaj.out";
int N,M,K,Rez;
int L[NMax],R[NMax];
bool visit[NMax];
vector<int> ad[NMax];
bool pairup(int x)
{
if (x<0 || visit[x]) return false;
visit[x]=true;
for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it) if (R[*it]<0)
{
L[x]=*it;
R[*it]=x;
return true;
}
for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it) if (pairup(R[*it]))
{
L[x]=*it;
R[*it]=x;
return true;
}
return false;
}
int main()
{
int i,x,y,c;
freopen(IN,"r",stdin);
scanf("%d%d%d",&N,&M,&K);
for (i=0;i<K;++i)
scanf("%d%d",&x,&y),
ad[x-1].push_back(y-1);
fclose(stdin);
for (i=0;i<N;++i) L[i]=-1;
for (i=0;i<M;++i) R[i]=-1;
for (c=1;c;)
{
c=0;
memset(visit,0,sizeof(visit));
for (i=0;i<N;++i) if (L[i]<0)
c |= pairup(i);
}
for (i=0;i<N;++i) Rez+=(L[i]>=0);
freopen(OUT,"w",stdout);
printf("%d\n",Rez);
for (i=0;i<N;++i) if (L[i]>=0)
printf("%d %d\n",i+1,L[i]+1);
fclose(stdout);
return 0;
}