Pagini recente » Cod sursa (job #756601) | Cod sursa (job #2914952) | Cod sursa (job #2840490) | Cod sursa (job #362427) | Cod sursa (job #398201)
Cod sursa(job #398201)
#include <stdio.h>
#define Nmax 275
struct nod{
int info;
nod *next;
};
nod *p[Nmax];
int l[Nmax],r[Nmax],v[Nmax],d[Nmax][Nmax],n,m;
void add(int k,int l)
{
nod *current=new nod;
current->info=l;
current->next=p[k];
p[k]=current;
}
int cupleaza(int i)
{
if(v[i])
return 0;
v[i]=1;
for(nod *current=p[i];current;current=current->next)
if(r[current->info]==0)
{
r[current->info]= i;
l[i]=current->info;
return 1;
}
for(nod *current=p[i];current;current=current->next)
if(cupleaza(r[current->info]))
{
r[current->info]=i;
l[i]=current->info;
return 1;
}
return 0;
}
int main()
{
int i,t,x,y,j;
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
add(x,y);
}
int ok;
for(ok=1;ok;)
{
ok=0;
for(i=1;i<=n;++i)
v[i]=0;
for(i=1;i<=n;++i)
if(l[i]==0)
ok |= cupleaza(i);
}
t=0;
for(i=1;i<=n;++i)
{
if(!r[i])
{
++t;
for(j=i;j;j=l[j])
{
++d[t][0];
d[t][d[t][0]]=j;
}
}
}
printf("%d\n",t-1);
for(i=1;i<t;++i)
printf("%d %d\n",d[i][d[i][0]],d[i+1][1]);
for(i=1;i<=t;++i)
{
for(j=1;j<=d[i][0];++j)
printf("%d ",d[i][j]);
}
return 0;
}