Cod sursa(job #127078)

Utilizator razvi9Jurca Razvan razvi9 Data 23 ianuarie 2008 12:43:49
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#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;}