Cod sursa(job #115417)

Utilizator anamaria1Ozorchevici Ana Maria anamaria1 Data 16 decembrie 2007 12:36:15
Problema Gather Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 2.38 kb
#include<fstream.h>
#define dim 751
unsigned long min=4294967294;
int nv[dim];
int n,m,k;
struct graf
 {struct vecini
   {int vec,ok;
    unsigned long c,d;
    vecini *urm;
   };
  vecini *v,*sf;
 };
graf l[dim];
int cel[16];
struct nod
 {int nr,nrd;
  unsigned long det;
  unsigned long s;
  nod *adu;
 };
nod *p,*u;

void parc(int x,int nr2,unsigned long ch,unsigned long sum)
{unsigned long mask,comp;
nod *man;
vecini *inc;
inc=l[x].v;
while(l[x].v)
  {if(l[x].v->ok)
    {if((nr2+1)<=l[x].v->d)
      {mask=1;mask=mask<<l[x].v->ok;
       comp=mask&ch;
       if(!comp)
	{if((nr2+1)==k)
	  {sum+=(nr2+1)*l[x].v->c;
	   if(sum<min) min=sum;
	  }
	  else
	   {man=new nod;
	    u->adu=man;
	    man->nr=l[x].v->vec;
	    man->nrd=nr2+1;
	    man->det=ch|mask;
	    man->s=sum+(nr2+1)*l[x].v->c;man->adu=0;
	    u=man;
	   }
	}
      }
    }
    else
     {if((nr2+1)<=l[x].v->d)
       {
	man=new nod;u->adu=man;man->nr=l[x].v->vec;man->nrd=nr2;man->det=ch;
	man->s=sum+(nr2+1)*l[x].v->c;man->adu=0;
	u=man;
       }
     }
   l[x].v=l[x].v->urm;
  }
l[x].v=inc;
}
void lee()
{nod *man;
int t,nr2;
unsigned long sum,ch;
while(p)
 {t=p->nr;ch=p->det;sum=p->s;nr2=p->nrd;
  parc(t,nr2,ch,sum);
  man=p;p=p->adu;delete man;
 }
}
int main()
{ifstream f("gather.in");
ofstream g("gather.out");
vecini *man;
f>>k>>n>>m;
int i,j,x,y,z,t,ok2;
for(i=1;i<=k;i++) f>>cel[i];
for(i=1;i<=m;i++)
 {f>>x>>y>>z>>t;
  if(!nv[x])
   {nv[x]++;
    l[x].v=new vecini;l[x].v->urm=0;l[x].v->c=z;l[x].v->d=t;l[x].v->vec=y;
    ok2=0;for(j=1;j<=k;j++) if(y==cel[j]) {ok2=j;break;}
    l[x].v->ok=ok2;
    l[x].sf=l[x].v;
   }
   else
    {nv[x]++;man=new vecini;l[x].sf->urm=man;man->urm=0;
     man->vec=y;man->c=z;man->d=t;
     ok2=0;for(j=1;j<=k;j++) if(y==cel[j]) {ok2=j;break;}
     man->ok=ok2;
     l[x].sf=man;
    }
  if(!nv[y])
   {nv[y]++;
    l[y].v=new vecini;l[y].v->urm=0;l[y].v->c=z;l[y].v->d=t;l[y].v->vec=x;
    ok2=0;for(j=1;j<=k;j++) if(x==cel[j]) {ok2=j;break;}
    l[y].v->ok=ok2;
    l[y].sf=l[y].v;
   }
   else
    {nv[y]++;man=new vecini;l[y].sf->urm=man;man->urm=0;
     man->vec=x;man->c=z;man->d=t;
     ok2=0;for(j=1;j<=k;j++) if(x==cel[j]) {ok2=j;break;}
     man->ok=ok2;
     l[y].sf=man;
    }
 }
f.close();
p=new nod;p->nr=1;p->det=0;p->s=0;p->nrd=0;p->adu=0;u=p;
lee();
g<<min<<'\n';
g.close();
return 0;
}