Cod sursa(job #115130)

Utilizator razvi9Jurca Razvan razvi9 Data 16 decembrie 2007 11:03:34
Problema Gather Scor 10
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 0.76 kb
#include<stdio.h>
int n,m,a[751][751],b[751][751],i,k,j,x,y,d[751],viz[751][751];
unsigned int min;
void df(int vf,int nr,int m);
int main()
{freopen("gather.in","r",stdin);
 freopen("gather.out","w",stdout);
 scanf("%d %d %d",&k,&n,&m);
 for(i=1;i<=k;i++){scanf("%d",&x);d[x]=1;}
 for(i=1;i<=m;i++)
 {scanf("%d %d",&x,&y);
  scanf("%d %d",&a[x][y],&b[x][y]);
  a[y][x]=a[x][y];b[y][x]=b[x][y];}
 min=3000000000;
 df(1,1,0);
 printf("%u",min);
 fclose(stdout);
 return 0;
}

void df(int vf,int nr,int m)
{if(m>min) return;
 if(nr==k&&d[vf]) {min=m;return;}
 for(int i=1;i<=n;i++)
  if(viz[vf][i]<2&&nr<=b[vf][i])
  {viz[vf][i]++;
   if(nr<b[vf][i]&&d[vf]) {d[vf]--;df(i,nr+1,m+a[vf][i]*(nr+1));d[vf]++;}
   df(i,nr,m+a[vf][i]*nr);
   viz[vf][i]--;}
 }