Pagini recente » Cod sursa (job #2543800) | Cod sursa (job #1086436) | Cod sursa (job #334053) | Cod sursa (job #2519019) | Cod sursa (job #2444320)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define cost first
#define node second
#define inf 1073741823
#define pii pair<int, int>
using namespace std;
int n, m, p, i, j, k, sol[501][51][51], dist[501][501], q, source[51], out=inf, l, noerase[501][51][51];
vector<pii> graph[501];
priority_queue<pii, vector<pii>, greater<pii> > pq;
void dijkstra(int start);
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d", &p, &n, &m);
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j) if(i!=j)dist[i][j]=inf;
for(i=1; i<=n; ++i)
for(j=1; j<=p; ++j)
for(k=1; k<=p; ++k) sol[i][j][k]=noerase[i][j][k]=inf;
for(i=1; i<=m; ++i){
int x, y, c;
scanf("%d%d%d", &x, &y, &c);
graph[x].push_back({c, y});
graph[y].push_back({c, x});
}
for(i=1; i<=p; ++i) {scanf("%d", &source[i]); if(source[i]==source[i-1]){--i; --p;}}
for(i=1; i<=p; ++i) dijkstra(source[i]);
for(i=1; i<=p; ++i)
for(j=1; j<=p; ++j) {
sol[source[j]][i][i]=dist[source[i]][source[j]];
}
for(k=1; k<p; ++k)
for(i=1; i<=p-k; ++i){
j=i+k;
for(q=i; q<=j; ++q){
int f, s;
f=s=sol[source[q]][i][j];
if(q>i)for(l=i; l<=q-1; ++l)
f=min(f, sol[source[l]][i][q-1]+dist[source[l]][source[q]]);
else f=0;
if(q<j)for(l=q+1; l<=j; ++l)
s=min(s, sol[source[l]][q+1][j]+dist[source[l]][source[q]]);
else s=0;
sol[source[q]][i][j]=min(f+s, sol[source[q]][i][j]);
}
}
for(i=1; i<=p; ++i){
out=min(out, sol[source[i]][1][p]+dist[source[i]][1]);
}
printf("%d", out);
return 0;
}
void dijkstra(int start){
pq.push({0, start});
while(!pq.empty()){
pii init=pq.top(), next; pq.pop();
if(dist[start][init.node]!=init.cost) continue;
for(auto j:graph[init.node]){
next={init.cost+j.cost, j.node};
if(next.cost<dist[start][next.node]){
dist[start][next.node]=next.cost;
pq.push(next);
}
}
}
return;
}