Pagini recente » Cod sursa (job #3230750) | Cod sursa (job #3038217) | Cod sursa (job #924272) | Cod sursa (job #761607) | Cod sursa (job #765388)
Cod sursa(job #765388)
#include<cstdio>
#define N 10001
int a[10*N],b[10*N],deg[N],*g[N],i,j,k,v[N],d[N],p1[N],p2[N],n,m,e,mg;
int B()
{int i,j,k,q[10*N],p=0,u=0;
for(i=1;i<=n;i++)
if(!p1[i])
d[i]=0,q[u++]=i;
else
d[i]=10*N;
d[0]=10*N;
while(p<u)
if((j=q[p++]))
for(k=0;k<deg[j];k++)
if(d[p2[g[j][k]]]==10*N)
d[p2[g[j][k]]]=d[j]+1,q[u++]=p2[g[j][k]];
return d[0]!=10*N;}
int D(int i)
{if(i)
{for(int j=0;j<deg[i];j++)
if(d[p2[g[i][j]]]==d[i]+1&&D(p2[g[i][j]])==1)
{p2[g[i][j]]=i;
p1[i]=g[i][j];
return 1;}
d[i]=10*N;
return 0;}
return 1;}
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",&a[i],&b[i]),deg[a[i]]++;
for(j=1;j<=n;deg[j++]=0)
g[j]=new int[deg[j]];
for(k=1;k<=e;k++)
g[a[k]][deg[a[k]]++]=b[k];
while(B())
for(j=1;j<=n;j++)
if(!p1[j]&&D(j))
v[++mg]=j;
printf("%d\n",mg);
for(i=1;i<=mg;i++)
printf("%d %d\n",p2[p1[v[i]]],p1[v[i]]);
return 0;}