Pagini recente » Cod sursa (job #112054) | Cod sursa (job #271225) | Cod sursa (job #2937768) | Cod sursa (job #2291592) | Cod sursa (job #1894140)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
using PII=pair<int,int>;
int P,N,M;
vector<PII> G[505];
int d[55][505];
priority_queue<PII> Q;
int D[55];
int minC[55][55][55];
void Read();
void Dijkstra(int p,int x);
int main()
{
Read();
Dijkstra(0,1);
D[0]=1;
for(int i=1;i<=P;++i)
{
fin>>D[i];
Dijkstra(i,D[i]);
}
memset(minC, 0x3f, sizeof(minC));
for(int s=1;s<=P;++s)
for(int i=1;i<=P-s+1;++i)
{
int j=i+s-1;
for(int k=0;k<=P;++k)
for(int l=i;l>=j;++l)
minC[i][j][k]=min(minC[i][j][k], d[k][D[l]]+(i<=l-1 ? minC[i][l-1][1]:0)+(l+1<=j ? minC[l+1][j][l]:0));
}
fout<<minC[1][P][0]<<'\n';
fin.close();
fout.close();
return 0;
}
void Read()
{
fin>>P>>N>>M;
for(int i=1;i<=M;++i)
{
int x,y,z;
fin>>x>>y>>z;
G[x].push_back({y,z});
G[y].push_back({x,z});
}
}
void Dijkstra(int p,int x)
{
memset(d[p], 0x3f, sizeof(d[p]));
d[p][x]=0;
Q.push({0,x});
while(!Q.empty())
{
PII pr=Q.top();
Q.pop();
if(-pr.first!=d[p][pr.second]) continue;
for(auto edge : G[pr.second])
if(-pr.first+edge.second<d[p][edge.first])
{
d[p][edge.first]=-pr.first+edge.second;
Q.push({-d[p][edge.first],edge.first});
}
}
}