Cod sursa(job #115466)

Utilizator DorinOltean Dorin Dorin Data 16 decembrie 2007 12:47:40
Problema Gather Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 1.37 kb
# include<stdio.h>

# define input "gather.in"
# define output "gather.out"

# define max 751
# define INF 1<<29

int n,m,k,j,p[max],x,y,cap,c[16][max][max],f[max][max],rez;

void back(int k,int nod,int o,int cost)
{
	 if(k==1)
	 {
		if(rez > cost + c[k][1][nod])
			rez = cost+c[k][1][nod];
	 }
     else
     {

	 for(int i=1;i<=n;i++)
	 {
		 if(p[i] && c[k][i][nod] !=INF && nod!=i)
		 if(!(o&(1<<p[i])))
         {
			 back(k-1,i,o|(1<<p[i]),cost + c[k][nod][i]*k);
		 }
     }
     }
}

int main()
{
	freopen(input,"r",stdin);
	freopen(output,"w",stdout);

	scanf("%d%d%d",&k,&n,&m);
int i;
    for(i=1;i<=k;i++)
    {
       scanf("%d",&j);
       p[j] = i;
	}

int    cost;

	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d%d",&x,&y,&cost,&cap);

		for(j=1;j<=(cap > k?k:cap);j++)
			c[j][x][y] = c[j][y][x] = cost;
		f[x][y] = f[y][x] = cap;
    }
    int l,s;
    
    for(s=1;s<=k;s++)
    for(i=1;i<=n;i++)
	   for(j=1;j<=n;j++)
		if(!c[s][i][j] &&i!=j)
		  c[s][i][j] = INF;

	for(s=1;s<=k;s++)
	for(i=1;i<=n;i++)
	   for(j=1;j<=n;j++)
		  for(l=1;l<=n;l++)
			 if(c[s][l][i] + c[s][i][j] < c[s][l][j] && f[l][i] >= s && f[i][j] >= s)
				 c[s][l][j] = c[s][l][i] + c[s][i][j];

	rez = INF;

	for(i=2;i<=n;i++)
    {
        if(p[i])
        back(k,i,1<<p[i],0);
    }
    

    printf("%d",rez);
    
	return 0;
}