Pagini recente » Cod sursa (job #560095) | Cod sursa (job #1106370) | Cod sursa (job #2695529) | Cod sursa (job #110921) | Cod sursa (job #422386)
Cod sursa(job #422386)
#include <stdio.h>
#include <algorithm>
#define INF 1000000000
#define MAXN 510
#define MAXP 51
using namespace std;
int A[MAXN][MAXN];
int dest[MAXP];
int drum[MAXP][MAXP];
int Dij[MAXN];
bool ok[MAXN];
int d[MAXP][MAXP][MAXP];
int i,n,m,p,j,k,x,y,c;
inline void dijkstra(int nod)
{
int minim,i,j;
memset(ok,false, sizeof(ok));
for (i=1; i<=n; i++)
Dij[i] = INF;
Dij[nod] = 0;
for (j=1; j<=n; j++){
minim = INF;
nod = 0;
for (i=1; i<=n; i++)
if (!ok[i] && Dij[i]<minim){
minim = Dij[i];
nod = i;
}
if (minim == INF) break;
ok[nod] = true;
for (i=1; i<=n; i++)
if (!ok[i] && Dij[i] > Dij[nod]+A[i][nod])
Dij[i] = Dij[nod] + A[i][nod];
}
}
inline int calcul(int x, int y, int source)
{
if (x>y) return 0;
if (x==y&&y==source) return 0;
if (d[x][y][source]<INF) return d[x][y][source];
int aux;
d[x][y][source] = INF;
for (aux=x; aux<=y; aux++)
d[x][y][source] = min(d[x][y][source], calcul(x,aux-1,aux)+calcul(aux+1,y,aux)+drum[source][aux]);
return d[x][y][source];
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d",&p);
scanf("%d",&n);
scanf("%d",&m);
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
A[i][j] = INF;
for (i=1; i<=m; i++){
scanf("%d %d %d",&x,&y,&c);
A[x][y] = A[y][x] = c;
}
for (i=1; i<=p; i++)
scanf("%d",&dest[i]);
dest[0] = 1;
for (i=0; i<=p; i++){
dijkstra(dest[i]);
for (j=1; j<=p; j++)
drum[i][j] = Dij[dest[j]];
}
for (i=0; i<=p; i++)
for (j=0; j<=p; j++)
for (k=0; k<=p; k++)
d[i][j][k] = INF;
printf("%d\n",calcul(1,p,0));
return 0;
}