Pagini recente » Cod sursa (job #464392) | Cod sursa (job #762286) | Cod sursa (job #2758509) | Cod sursa (job #1614986) | Cod sursa (job #1216368)
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct celula{
int nod;
celula *next;
}*lista;
int i,j,n,m,e,x,y,sol,cuplare(1);
int viz[10005],lmatch[10005],rmatch[10005];
lista lda[10005];
void openIOFiles()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
}
void add(int nod,lista &p)
{
lista r=new celula;
r->nod=nod;
r->next=p;
p=r;
}
int Hopcroft(int x) {
lista p;
if(viz[x]==1) return 0;
viz[x]=1;
for(p=lda[x];p;p=p->next)
if(rmatch[p->nod]==0) {
lmatch[x]=p->nod;
rmatch[p->nod]=x;
return 1;
}
for(p=lda[x];p;p=p->next)
if(Hopcroft(rmatch[p->nod])==1) {
lmatch[x]=p->nod;
rmatch[p->nod]=x;
return 1;
}
return 0;
}
int main()
{
openIOFiles();
scanf("%d%d%d",&n,&m,&e);
while(e--){
scanf("%d%d",&x,&y);
add(y,lda[x]);
}
while(cuplare){
cuplare=0;
memset(viz,0,sizeof viz);
for(i=1;i<=n;i++)
if(!lmatch[i]) cuplare+=Hopcroft(i);
}
for(i=1;i<=n;i++)
if(lmatch[i]) ++sol;
printf("%d\n",sol);
for(i=1;i<=n;i++)
if(lmatch[i]) printf("%d %d\n",i,lmatch[i]);
return 0;
}