Cod sursa(job #116988)

Utilizator malexMunteanu Alexandru malex Data 20 decembrie 2007 08:41:49
Problema Felinare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include<cstdio>
#include<stdlib.h>
#define MAXN 10000
struct nod {int nr,gr,tip;};
nod h[MAXN];
int sort_function(nod *a,nod *b)
{
	return a->gr-b->gr;
}

int main()
{
  FILE *f,*g;
  int *x[MAXN],*y[MAXN],*xx[MAXN],*yy[MAXN],n,m,fel[MAXN],varf,tip,ok,varf2,k,total=0;
  int i,j,a,b;
  f=fopen("felinare.in","r");
  g=fopen("felinare.out","w");
  fscanf(f,"%d %d",&n,&m);
  for(i=1;i<=n;i++) {x[i]=(int *) malloc(sizeof(int));x[i][0]=0;
		     y[i]=(int *) malloc(sizeof(int));y[i][0]=0;
		     xx[i]=(int *) malloc(sizeof(int));xx[i][0]=0;
		     yy[i]=(int *) malloc(sizeof(int));yy[i][0]=0;
		     fel[i]=0;
  }
  for(i=0;i<m;i++)
	{
	  fscanf(f,"%d %d",&a,&b);
	  x[a]=(int *)realloc(x[a],sizeof(int)*(x[a][0]+2));
	  y[b]=(int *)realloc(y[b],sizeof(int)*(y[b][0]+2));
	  x[a][++x[a][0]]=b;
	  y[b][++y[b][0]]=a;
	  xx[a]=(int *)realloc(xx[a],sizeof(int)*(xx[a][0]+2));
	  yy[b]=(int *)realloc(yy[b],sizeof(int)*(yy[b][0]+2));
	  xx[a][++xx[a][0]]=0;
	  yy[b][++yy[b][0]]=0;
	}
  for(i=1;i<=n;i++)
  {
   h[i].nr=i;
   h[i].gr=x[i][0];
   h[i].tip=1;
  }
  for(i=1;i<=n;i++)
  {
   h[i+n].nr=i;
   h[i+n].gr=y[i][0];
   h[i+n].tip=2;
  }

 qsort(h+1, 2*n, sizeof(nod), (int (*)(const void* ,const void* ))sort_function);
 for(i=1;i<=2*n;i++)
 {
  varf=h[i].nr;
  tip=h[i].tip;
  if(h[i].gr==0) {fel[varf]+=tip;total++;}
  else{
   if(tip==2)
   {
    ok=1;
    for(j=1;j<=y[varf][0];j++)
     if(yy[varf][j]) {ok=0;break;}
    if(ok)
    {
	fel[varf]+=tip;total++;
	    for(j=1;j<=y[varf][0];j++)
	    {
	     yy[varf][j]=1;
	     varf2=y[varf][j];
	     for(k=1;k<=x[varf2][0];k++)
	     if(x[varf2][k]==varf){xx[varf2][k]=1;break;}
	    }
    }
   }

   if(tip==1)
   {
    ok=1;
    for(j=1;j<=x[varf][0];j++)
     if(xx[varf][j]) {ok=0;break;}
    if(ok)
    {
	fel[varf]+=tip;total++;
	    for(j=1;j<=x[varf][0];j++)
	    {
	     xx[varf][j]=1;
	     varf2=x[varf][j];
	     for(k=1;k<=y[varf2][0];k++)
	     if(y[varf2][k]==varf){yy[varf2][k]=1;break;}
	    }
    }
   }
  }
 }
fprintf(g,"%d\n",total);
for(i=1;i<=n;i++)
fprintf(g,"%d\n",fel[i]);
fclose(f);fclose(g);
 return 0;
}