Pagini recente » Cod sursa (job #510265) | Cod sursa (job #1790928) | Cod sursa (job #1498271) | Cod sursa (job #2007817) | Cod sursa (job #1724604)
#include <bits/stdc++.h>
#define maxN 2004
#define maxK 18
#define INF 0x3f3f3f3f
using namespace std;
int n,m,i,j,k,x,y,z,mask;
vector<pair<int,int> >v[maxN];
int dp[(1<<maxK)][maxK],sol=INF;
int dist[maxK][maxN],g[maxK];
priority_queue<pair<int,int> ,vector<pair<int,int> >, greater<pair<int,int> > > heap;
void dijkstra(int ind,int nod)
{
int i;
for(i=1;i<=n;i++)
dist[ind][i]=INF;
dist[ind][nod]=0;
heap.push(make_pair(0,nod));
while(!heap.empty())
{
x=heap.top().second;
heap.pop();
for(vector<pair<int,int> >::iterator it=v[x].begin();it!=v[x].end();it++)
if(dist[ind][it->first]>dist[ind][x]+it->second)
{
dist[ind][it->first]=dist[ind][x]+it->second;
heap.push(make_pair(dist[ind][it->first],it->first));
}
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d %d %d",&n,&m,&k);
for(i=1;i<=k;i++)
scanf("%d",&g[i]);
g[0]=1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
k++;
for(i=0;i<k;i++)
dijkstra(i,g[i]);
memset(dp,INF,sizeof(dp));
dp[1][0]=0;
for (i=1;i<(1<<k);++i){
for (j=0;j<k;++j){
if (i&(1<<j)){
for ( int p=0;p<k;++p){
if (p!=j && (i&(1<<p)))
dp[i][j]=min (dp[i][j],dp[i^(1<<j)][p]+dist[p][g[j]]);
}
}
}
}
int Sol=INF;
for (int i=0;i<k;++i)
Sol=min(Sol,dp[(1<<k)-1][i]+dist[i][n]);
printf ("%d",Sol);
return 0;
}