Cod sursa(job #181129)

Utilizator Stingacianu.VladStingacianu Vlad Stingacianu.Vlad Data 17 aprilie 2008 21:30:14
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;}