Pagini recente » Cod sursa (job #584456) | Cod sursa (job #1068237) | Cod sursa (job #2176813) | Cod sursa (job #842865) | Cod sursa (job #2297742)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
vector<pair<int,int>> v[2000];
int a[20],c[20][2002],dp[(1<<17)+2][18],k;
priority_queue<pair<int,int>> h;
void dij(int st)
{
int nr=a[st],nr1,nr2;
h.push({0,nr});
while(!h.empty())
{
while(!h.empty()&&c[st][h.top().y]>0)
h.pop();
if(h.empty())
return;
nr1=h.top().y;nr2=-h.top().x;
h.pop();
c[st][nr1]=nr2;
for(auto it:v[nr1])
if(it.y!=nr&&(c[st][it.y]==0||c[st][it.y]<-nr2-it.x))
{
c[st][it.y]=-nr2-it.x;
h.push({c[st][it.y],it.y});
}
}
}
int solve(int nr,int j)
{
if(dp[nr][j]||(nr==1&&j==0))
return dp[nr][j];
dp[nr][j]=1<<28;
for(int i=0;i<k;i++)
if((nr&(1<<i))&&(i||nr==(1<<j)+1))
dp[nr][j]=min(dp[nr][j],solve(nr^(1<<j),i)+c[i][a[j]]);
return dp[nr][j];
}
int main()
{
int n,m,i,nr,nr1,nr2;
in>>n>>m>>k;k++;
for(i=1;i<k;i++)
in>>a[i];
a[0]=1;a[k++]=n;
for(i=0;i<m;i++)
{
in>>nr1>>nr2>>nr;
v[nr1].push_back({nr,nr2});
v[nr2].push_back({nr,nr1});
}
for(i=0;i<k;i++)
dij(i);
out<<solve((1<<k)-1,k-1);
return 0;
}