Pagini recente » Cod sursa (job #2252877) | Cod sursa (job #340480) | Cod sursa (job #2809450) | Cod sursa (job #1947687) | Cod sursa (job #780771)
Cod sursa(job #780771)
/*Cuplaj maxim in graf bipartit*/
#include<cstdio>
#include<list>
#include<algorithm>
using namespace std;
int N,M,E,i,u,v;
list<int> L[10001];
int cuplN[10001],cuplM[10001],viz[10001];
int change,nr;
int cupleaza(int xu)
{if(viz[xu]) return 0;
list<int>::iterator it;
for(it=L[xu].begin(); it!=L[xu].end(); it++)
{int xv=*it;
if(cuplM[xv]==0)
{cuplM[xv]=xu; cuplN[xu]=xv;
nr++;
return 1;}
}
viz[xu]=1;
for(it=L[xu].begin(); it!=L[xu].end(); it++)
{int xv=*it;
if(cuplM[xv]!=0 && cupleaza(cuplM[xv]))
{cuplM[xv]=xu; cuplN[xu]=xv;
return 1;}
}
return 0;
}
int main()
{freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&N,&M,&E);
for(i=1; i<=E; i++)
{scanf("%d %d",&u,&v);
L[u].push_back(v);}
change=1;
while(change)
{change=0;
for(u=1; u<=N; u++)
if(cuplN[u]==0)
change=cupleaza(u);
}
printf("%d\n",nr);
for(i=1; i<=max(N,M); i++)
if(cuplN[i]!=0)
printf("%d %d\n",i,cuplN[i]);
return 0;}