Pagini recente » Cod sursa (job #50770) | Cod sursa (job #922609) | Cod sursa (job #429413) | Cod sursa (job #1452429) | Cod sursa (job #1724599)
#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> > 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(mask=1;mask<(1<<k);mask++)
for(i=0;i<k;i++)
if(mask&(1<<i))
for(j=0;j<k;j++)
if(j!=i && (mask&(1<<j)))
dp[mask][i]=min(dp[mask][i],dp[mask^(1<<i)][j]+dist[j][g[i]]);
for(i=0;i<k;i++)
sol=min(sol,dp[(1<<k)-1][i]+dist[i][n]);
printf("%d",sol);
return 0;
}