Pagini recente » Cod sursa (job #2601339) | Cod sursa (job #30319) | Cod sursa (job #2778818) | Cod sursa (job #108223) | Cod sursa (job #2015101)
#include <bits/stdc++.h>
using namespace std;
int n, m, p, dest[55];
const int INF = 2000000000;
bool f[505];
vector <pair <int, int> > v[505];
priority_queue <pair <int, int> > q;
int d[505][505];
int dp[55][55][55];
inline void dijkstra(int nod, int d[]){
memset(f, 0, sizeof(f));
q.push(make_pair(0, nod));
d[nod] = 0;
while(!q.empty()){
pair <int, int> aux = q.top();
q.pop();
if(!f[aux.second])
for(vector <pair <int, int> > :: iterator it = v[aux.second].begin(); it != v[aux.second].end() ; ++it){
if(d[it->first] > d[aux.second] + it->second){
d[it->first] = d[aux.second] + it->second;
q.push(make_pair(-d[it->first], it->first));
}
f[aux.second] = 1;
}
}
}
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d", &p, &n, &m);
int x, y, c;
for(int i = 1; i <= m ; ++i){
scanf("%d%d%d", &x, &y, &c);
v[x].push_back(make_pair(y, c));
v[y].push_back(make_pair(x, c));
}
for(int i = 0; i <= n ; ++i)
for(int j = 0; j <= n ; ++j)
d[i][j] = INF;
for(int i = 1; i <= p ; ++i)
scanf("%d", &dest[i]);
dest[0] = 1;
v[0].push_back(make_pair(1, 0));
for(int i = 0; i <= p ; ++i)
dijkstra(dest[i], d[i]);
for(int st = p; st >= 1 ; --st)
for(int dr = st; dr <= p ; ++dr)
for(int k = 0; k <= p ; ++k){
dp[st][dr][k] = INF;
for(int nod = st; nod <= dr ; ++nod)
dp[st][dr][k] = min(dp[st][dr][k], dp[st][nod - 1][nod] + dp[nod + 1][dr][nod] + d[k][dest[nod]]);
}
printf("%d", dp[1][p][0]);
return 0;
}