Pagini recente » Cod sursa (job #1328322) | Cod sursa (job #2385910) | Cod sursa (job #2671717) | Cod sursa (job #1821421) | Cod sursa (job #115607)
Cod sursa(job #115607)
#include <stdio.h>
#define NMAX 760
#define inf 32000
int n, m, k;
int a, b, c, d;
int C[NMAX][NMAX];
int M[NMAX][NMAX];
int nod[NMAX];
int D[NMAX], pre[NMAX], Q[NMAX];
long sol;
int A[16][16][16];
int nA[16];
int V[16];
int min;
void djikstra(int x,int y)
{
int i, j;
int dmin=inf, vfmin;
for (i=1; i<=n; ++i) Q[i]=D[i]=pre[i]=0;
for (i=1; i<=n; ++i)
{
D[i]=C[x][i]; pre[i]=x;
}
Q[x]=1;pre[x]=0;
D[x]=0;
for (j=1; j<n; ++j)
{
dmin=inf;
for (i=1; i<=n; ++i)
if (!Q[i] && dmin>D[i])
{
dmin=D[i];
vfmin=i;
}
Q[vfmin]=1;
for (i=1; i<=n; ++i)
if (!Q[i] && D[i]>dmin+C[vfmin][i])
{
pre[i]=vfmin;
D[i]=dmin+C[vfmin][i];
}
}
}
int jo(int x,int j)
{
for (int i=0; i<=x; ++i)
if (V[i]==j) return 0;
return 1;
}
void back(int x, int l)
{
if (x==k+1)
if (sol>min) sol=min;
else;
else
{
for (int i=0; i<=k; ++i)
if (jo(x-1,i))
{
min+=A[V[x-1]][i][l]*(l+1);
V[x]=i;
back(x+1,l+1);
V[x]=0;
min-=A[V[x-1]][i][l]*(l+1);
}
}
}
int main()
{
freopen("gather.in","r",stdin);
freopen("gather.out","w",stdout);
int i, j, l, loc, mini;
scanf("%d %d %d", &k, &n, &m);
for (i=1; i<=k; ++i)
{
scanf("%d", &a);
nod[a]=1;
nA[i]=a;
}
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j)
C[i][j]=inf;
for (i=1; i<=m; ++i)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
C[a][b]=C[b][a]=c;
M[a][b]=M[b][a]=d;
}
nA[0]=1;
for (j=0; j<k; ++j)
{
for (i=0; i<=k; ++i)
{
djikstra(nA[i],j);
for (l=0; l<=k; ++l)
A[i][l][j]=D[nA[l]];
}
for (i=1; i<=n; ++i)
for (l=1; l<=n; ++l)
if(M[i][l]==j) C[j][l]=inf;
}
min=0;
sol=inf;
V[0]=0;
back(1,0);
printf("%ld", sol);
fclose(stdin);
fclose(stdout);
return 0;
}