Pagini recente » Cod sursa (job #1413671) | Cod sursa (job #2029480) | Cod sursa (job #1123771) | Cod sursa (job #598631) | Cod sursa (job #127078)
Cod sursa(job #127078)
#include<stdio.h>
#include<string.h>
int a[256][256],i,j,n,dr[256],st[256],viz[256],nr,m,r[256][256],used[256];
int cupleaza(int nod)
{int i;
if(viz[nod]) return 0;
viz[nod]=1;
for(i=1;i<=n;i++)
if(a[nod][i])
if(!dr[i] || cupleaza(dr[i]))
{st[nod]=i;
dr[i]=nod;
return 1;}
return 0;}
void cuplaj()
{for(i=1;i<=n;i++)
if(!st[i])
if(cupleaza(i)) nr++;
else{
memset(viz,0,sizeof(viz));
if(cupleaza(i)) nr++;}
}
int main()
{freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);
scanf("%d %d",&n,&m);
for(;m;m--)
{scanf("%d %d",&i,&j);
a[i][j]=1;}
cuplaj();
nr=n;
while(nr)
{for(i=1;i<=n;i++) if(!used[i] && !dr[i]) break;
r[++m][0]=1; r[m][1]=i; used[i]=1; nr--;
while(st[i]) {i=st[i]; r[m][++r[m][0]]=i; used[i]=1;nr--;}}
printf("%d\n",m-1);
for(i=1;i<m;i++)
printf("%d %d\n",r[i][r[i][0]],r[i+1][1]);
for(i=1;i<=m;i++)
for(j=1;j<=r[i][0];j++) printf("%d ",r[i][j]);
fclose(stdout);
return 0;}