Pagini recente » Cod sursa (job #1632068) | Cod sursa (job #2658714) | Cod sursa (job #2932644) | Cod sursa (job #2885340) | Cod sursa (job #1593890)
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>
#define Ndim 503
#define Pdim 53
#define INF 0x3f3f3f3f
#define pb push_back
#define mkp make_pair
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
int N,M,P,BST[Pdim][Pdim][Pdim],dist[Pdim][Pdim],Ldrum[Ndim];
short int dest[Pdim];
vector <pair <int,int> > G[Ndim];
void read()
{
int i,a,b,c;
fin>>P>>N>>M;
for(i=1;i<=M;i++)
{
fin>>a>>b>>c;
G[a].pb(mkp(b,c));
G[b].pb(mkp(a,c));
}
for(i=1;i<=P;i++)
fin>>dest[i];
dest[P+1] = 1;
}
void dijkstra(int start)
{
int newnode,newcost;
memset(Ldrum,INF,sizeof(Ldrum));
priority_queue < pair<int,int> > Q;
Q.push(mkp(0,start));
Ldrum[start] = 0;
while(!Q.empty())
{
int node = Q.top().second, cost = -Q.top().first;
Q.pop();
if (Ldrum[node] != cost)
continue;
for(size_t i = 0;i<G[node].size();i++)
{
newnode = G[node][i].first;
newcost = G[node][i].second;
if(Ldrum[newnode] > cost + newcost)
{
Ldrum[newnode] = cost + newcost;
Q.push(mkp(-Ldrum[newnode],newnode));
}
}
}
}
void prep()
{
int i,j;
for(i=1;i<=P+1;i++)
{
dijkstra(dest[i]);
for(j=1;j<=P+1;j++)
{
dist[i][j] = Ldrum[dest[j]];
}
}
}
void solve()
{
int len,left,right,i,place;
for(len = 1; len <= P; len++)
{
for(left = 1;left + len -1 <= P+1; left++)
{
right = left + len - 1;
for(place = 1; place <= P+1; ++place)
{
BST[left][right][place] = INF;
for(i=left;i<=right;i++)
{
BST[left][right][place] = min (BST[left][right][place], dist[place][i] + BST[left][i-1][i] + BST[i+1][right][i]);
}
}
}
}
}
void print()
{
fout<<BST[1][P][P+1];
}
int main()
{
read();
prep();
solve();
print();
return 0;
}