Pagini recente » Cod sursa (job #251785) | Cod sursa (job #2758725) | Cod sursa (job #293438) | Cod sursa (job #36210) | Cod sursa (job #1173383)
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#define inf 1000000000
#define vintp vector<pair<int,int> >::iterator
using namespace std;
ifstream fin ("team.in");
ofstream fout ("team.out");
int n,p,m,a,b,c,ans;
int dest[51],d[501];
vector<pair<int,int > >G[501];
priority_queue <pair<int,int>, vector<pair<int,int> >,greater <pair<int,int> > > H;
int C[51][51],C1[51];
int dp[51][51][51];
void dijkstra (int x, int wh)
{
for (int i=1; i<=n; ++i)
d[i] = inf;
d[x] = 0;
H.push (make_pair(0,x));
while (!H.empty ())
{
pair<int,int> a = H.top ();
H.pop ();
if (a.first != d[a.second])
continue;
int x = a.second;
for (vintp it = G[x].begin (); it != G[x].end(); ++it)
{
if (d[x] + it->second < d[it->first])
{
d[it->first] = d[x] + it->second;
H.push (make_pair (d[it->first],it->first));
}
}
}
for (int i=1; i<=p; ++i)
{
C[wh][i] = d[dest[i]];
}
C1[wh] = d[1];
}
int main()
{
fin>>p>>n>>m;
for (int i=1; i<=m; ++i)
{
fin>>a>>b>>c;
G[a].push_back (make_pair(b,c));
G[b].push_back (make_pair(a,c));
}
for (int i=1; i<=p; ++i)
{
fin>>dest[i];
}
for (int i=1; i<=p; ++i)
dijkstra(dest[i],i);
for (int i=1; i <= p; ++i)
for (int j=1; j <= p; ++j)
dp[i][i][j] = C[i][j];
for (int i=1; i<p; ++i)
{
for (int j=1; j+i <=p; ++j)
{
int ii = j, jj = i+j;
for (int k=1; k<=p; ++k)
{
dp[ii][jj][k] = min (C[k][ii] + dp[ii+1][jj][ii], C[k][jj] + dp[ii][jj-1][jj]);
for (int h=ii+1; h <jj; ++h)
{
dp[ii][jj][k] = min (dp[ii][jj][k], C[k][h] + dp[ii][h-1][h] + dp[h+1][jj][h]);
}
}
}
}
ans = min (C1[1] + dp[2][p][1], C1[p] + dp[1][p-1][p]);
for (int i=1; i<=p; ++i)
{
ans = min (ans,C1[i] + dp[1][i-1][i] + dp[i+1][p][i]);
}
fout<<ans;
}