Pagini recente » Profil somya1405 | Cod sursa (job #115466)
Cod sursa(job #115466)
# 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;
}