Pagini recente » Cod sursa (job #1129378) | Cod sursa (job #1725467) | Cod sursa (job #875560) | Cod sursa (job #2436105) | Cod sursa (job #313004)
Cod sursa(job #313004)
#include <stdlib.h>
#include <stdio.h>
#define M 200001
#define N 10001
int p[N],urm[M],muc[M],s,d,e,vf;
int leg[N],tata[N],viz[N];
typedef struct
{int n;
struct nod *urm;
}nod;
nod *prim,*ultim;
void adaugam(int a,int b)
{muc[vf]=b;
urm[vf]=p[a];
p[a]=vf;
vf++;
}
void push(int k)
{nod *p=(nod*)malloc(sizeof(nod));
p->n=k;
p->urm=NULL;
if(prim==NULL)
{prim=p;
}
else
{ultim->urm=p;
}
ultim=p;
}
void sterge()
{nod *p;
p=prim;
prim=prim->urm;
free (p);
}
int bf(int k)
{if(leg[k]!=0) return;
push(k);
viz[k]=1;
int i;
while(prim!=NULL)
{if(prim->n<=s)
{//if(leg[prim->n]==0)
{for (i=p[prim->n];i;i=urm[i])
{if(viz[muc[i]]==0)
{tata[muc[i]]=prim->n;
push(muc[i]);
viz[muc[i]]=1;
}
}
}
}
else
{if(leg[prim->n]==0)
{return prim->n;
}
for (i=p[prim->n];i;i=urm[i])
{if(leg[muc[i]]==prim->n&&viz[muc[i]]==0)
{viz[muc[i]]=1;
push(muc[i]);
tata[muc[i]]=prim->n;
}
}
}
sterge();
}
}
int main ()
{int i,j,k,a,b,count;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&s,&d,&e);
for(vf=1,i=1;i<=e;i++)
{scanf("%d %d",&a,&b);
adaugam(a,b+s);
adaugam(b+s,a);
}
prim=ultim=NULL;
for (i=1;i<=s;i++)
{memset(viz,0,sizeof(viz));
memset(tata,0,sizeof(viz));
while(prim!=NULL)sterge();
k=bf(i);
for (j=k;j;j=tata[j])
{if(j>s)
{leg[j]=tata[j];
leg[tata[j]]=j;
}
else
{leg[tata[j]]=0;
}
}
}
for (i=1,count=0;i<=s;i++)
{if(leg[i]!=0) count++;
}
printf("%d\n",count);
for (i=1;i<=s;i++)
{if(leg[i]!=0)
{printf("%d %d\n",i,leg[i]-s);
}
}
return 0;
}