Pagini recente » Cod sursa (job #22467) | Cod sursa (job #134941) | Cod sursa (job #2380477) | Cod sursa (job #1791018)
#include <cstdio>
#include <cstring>
#define INF 1000000000
#define MAXK 50
#define MAXN 500
int n, d[MAXN+1][MAXN+1], ans[MAXK+1][MAXK+1][MAXN+1], t[MAXK+1];
bool viz[MAXN+1];
int cost[MAXN+1][MAXN+1];
inline int min2(int a, int b){
if(a<b) return a;
else return b;
}
int solve(int st, int dr, int x){
if(st>dr) return 0;
if(ans[st][dr][x]!=INF) return ans[st][dr][x];
for(int i=st; i<=dr; i++) ans[st][dr][x]=min2(ans[st][dr][x], solve(st, i-1, t[i])+solve(i+1, dr, t[i])+d[x][t[i]]);
return ans[st][dr][x];
}
inline void dijkstra(int sursa){
int best, x;
memset(viz, 0, sizeof viz);
for(int i=0; i<=n; i++)
d[sursa][i]=INF;
d[sursa][sursa]=0;
viz[sursa]=1;
best=sursa;
for(int i=2; i<=n; i++){
x=best;
best=0;
for(int i=1; i<=n; i++){
if(!viz[i]){
d[sursa][i]=min2(d[sursa][i], d[sursa][x]+cost[x][i]);
if(d[sursa][i]<d[sursa][best]) best=i;
}
}
viz[best]=1;
}
}
int main(){
int k, m, x, y, z;
FILE *fin, *fout;
fin=fopen("team.in", "r");
fout=fopen("team.out", "w");
fscanf(fin, "%d%d%d", &k, &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(i!=j)
cost[i][j]=INF;
for(int i=0; i<m; i++){
fscanf(fin, "%d%d%d", &x, &y, &z);
if(z<cost[x][y]) cost[x][y]=z;
if(z<cost[y][x]) cost[y][x]=z;
}
dijkstra(1);
for(int i=1; i<=k; i++)
for(int j=1; j<=k; j++)
for(int p=1; p<=n; p++)
ans[i][j][p]=INF;
for(int i=1; i<=k; i++){
fscanf(fin, "%d", &t[i]);
dijkstra(t[i]);
ans[i][i][t[i]]=0;
}
fprintf(fout, "%d\n", solve(1, k, 1));
fclose(fin);
fclose(fout);
return 0;
}