Pagini recente » Cod sursa (job #107002) | Cod sursa (job #2414919) | Cod sursa (job #108727) | Cod sursa (job #108718) | Cod sursa (job #2015133)
#include<bits/stdc++.h>
#define maxN 1005
#define inf 2000000
#define maxP 55
using namespace std;
vector<pair<int,int> > v[maxN];
int dist[maxN][maxN],n,stop[maxN];
typedef struct tip
{
int nod,cost;
bool operator<(const tip& other) const
{
return cost>other.cost;
}
};
priority_queue<tip> q;
inline void RunDijkstra(int node)
{
for(int i=1;i<=n;i++)
{
dist[stop[node]][i]=inf;
q.push({i,inf});
}
dist[stop[node]][stop[node]]=0;
q.push({stop[node],0});
while(!q.empty())
{
int nod=q.top().nod;
int cost=q.top().cost;
q.pop();
if(cost>dist[stop[node]][nod]) continue;
for(vector<pair<int,int> >::iterator it=v[nod].begin();it!=v[nod].end();it++)
{
if(cost+it->second<dist[stop[node]][it->first])
{
dist[stop[node]][it->first]=cost+it->second;
q.push({it->first,dist[stop[node]][it->first]});
}
}
}
}
int p,m,x,y,c,dp[maxP][maxP][maxP];
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d",&p);
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back({y,c});
v[y].push_back({x,c});
}
for(int i=1;i<=p;i++)
scanf("%d",&stop[i]);
stop[0]=1;
for(int i=0;i<=p;i++)
RunDijkstra(i);
for(int i=0;i<=p;i++)
for(int j=0;j<=p;j++)
for(int k=0;k<=p;k++)
{
dp[i][j][k]=inf;
if(i>j) dp[i][j][k]=0;
}
for(int i=0;i<=p;i++)
dp[i][i][i]=0;
for(int len=1;len<=p;len++)
for(int i=1;(i+len-1)<=p;i++)
{
int j=i+len-1;
for(int k=0;k<=p;k++)
{
if(i==j && i==k) continue;
for(int t=i;t<=j;t++)
dp[i][j][k]=min(dp[i][j][k],dp[i][t-1][t]+dp[t+1][j][t]+dist[stop[k]][stop[t]]);
}
}
printf("%d\n",dp[1][p][0]);
return 0;
}