Pagini recente » Cod sursa (job #298642) | Cod sursa (job #749634) | Cod sursa (job #618910) | Cod sursa (job #31450) | Cod sursa (job #1721494)
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define MAXN 55
#define MAXV 510
#define INF 1000000000
using namespace std;
int people,vertices,edges;
int cost[MAXN][MAXN],best[MAXV],destination[MAXN],dp[MAXN][MAXN][MAXN];
vector<pair<int,int> > g[MAXV];
class Compare{
public:
bool operator()(int &x,int &y){
return best[x]>best[y];
}
};
priority_queue<int,vector<int>,Compare> Heap;
void Dijkstra(int start){
int i,node;
for(i=0;i<=vertices;i++)
best[i]=INF;
best[start]=0;
Heap.push(start);
while(!Heap.empty()){
node=Heap.top();
Heap.pop();
for(i=0;i<g[node].size();i++)
if(best[g[node][i].first]>best[node]+g[node][i].second){
best[g[node][i].first]=best[node]+g[node][i].second;
Heap.push(g[node][i].first);
}
}
}
void Precompute(){
int i,j;
for(i=0;i<=people;i++){
Dijkstra(destination[i]);
for(j=0;j<=people;j++)
cost[i][j]=best[destination[j]];;
}
}
int minimum(int a,int b){
if(a<b)
return a;
return b;
}
int Solve(int i,int j,int start){
int k;
if(i>j||(i==j&&i==start))
return 0;
if(dp[i][j][start]!=INF)
return dp[i][j][start];
for(k=i;k<=j;k++)
dp[i][j][start]=minimum(dp[i][j][start],Solve(i,k-1,k)+Solve(k+1,j,k)+cost[start][k]);
return dp[i][j][start];
}
int main(){
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
int i,j,k,a,b,c;
scanf("%d%d%d",&people,&vertices,&edges);
for(i=1;i<=edges;i++){
scanf("%d%d%d",&a,&b,&c);
g[a].push_back(make_pair(b,c));
g[b].push_back(make_pair(a,c));
}
destination[0]=1;
for(i=1;i<=people;i++)
scanf("%d",&destination[i]);
Precompute();
for(i=0;i<=people;i++)
for(j=0;j<=people;j++)
for(k=0;k<=people;k++)
dp[i][j][k]=INF;
printf("%d",Solve(1,people,0));
return 0;
}