Cod sursa(job #205866)

Utilizator razvan_emPrecupas Razvan razvan_em Data 3 septembrie 2008 12:26:13
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 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;}