Pagini recente » Cod sursa (job #1090708) | Cod sursa (job #731363) | Cod sursa (job #2080080) | Cod sursa (job #2453010) | Cod sursa (job #2815925)
#define inf 0x3f3f3f3f
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector<vector<pair<int, int>>>g(2001);
int n, m, k;
int dist[18][2001];
int f[18], fl;
int dp[(1<<18)], lastadd[(1<<18)];
void dijkstra(int varf, int id)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>q;
vector<int>d(2001, inf);
q.push({0, varf}), d[varf]=0;
while(!q.empty())
{
int cost=q.top().first;
int nod=q.top().second;
q.pop();
if(d[nod]<cost)
continue;
for(auto val:g[nod])
if(d[val.first]>d[nod]+val.second)
d[val.first]=d[nod]+val.second, q.push({d[val.first], val.first});
}
for(int i=1; i<=n; i++)
dist[id][i]=d[i];
}
void read()
{
fin >> n >> m >> k;
f[0]=1;
for(int i=2; i<=k+1; i++)
fin >> f[++fl];
f[++fl]=n;
fl++;
for(int i=1, a, b, c; i<=m; i++)
fin >> a >> b >> c, g[a].push_back({b, c}), g[b].push_back({a, c});
for(int i=0; i<fl; i++)
dijkstra(f[i], i);
}
int bktrez[25], pa;
void attr(int mask)
{
for(int j=0; j<fl; j++)
{
if(!(mask&(1<<j)))
{
int ind=lastadd[mask];
if(dp[mask|(1<<j)]>dp[mask]+dist[j][f[ind]])
dp[mask|(1<<j)]=dp[mask]+dist[j][f[ind]], lastadd[mask|(1<<j)]=ind;
}
}
}
void bkt(int k, int nr=0)
{
for(int i=bktrez[k-1]+1; i<(fl-pa+k); i++)
{
bktrez[k]=i;
if(k<pa)
bkt(k+1, nr+(1<<i));
else
attr(nr+(1<<i));
}
}
void solve()
{
for(int i=0; i<(1<<fl); i++)
dp[i]=inf;
for(int j=0; j<fl; j++)
dp[1<<j]=0, lastadd[1<<j]=j;
for(int i=2; i<=fl; i++)
bktrez[0]=-1, pa=i-1, bkt(1);
fout << dp[(1<<fl)-1];
}
int main()
{
read();
solve();
return 0;
}