Pagini recente » Cod sursa (job #1000812) | Cod sursa (job #1470004) | Cod sursa (job #634925) | Cod sursa (job #1155470) | Cod sursa (job #2254866)
#include <bits/stdc++.h>
#define mp make_pair
#define f first
#define s second
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,i,x,y,z,nn,nd,ans,j,l;
int c[20];
int dr[20][2001],dp[1<<15][15];
vector < pair<int,int> > v[2001];
queue < pair<int,int> > q;
void dijkstra(int nod,int sol[])
{
for(int i=1;i<=n;i++)
sol[i]=INT_MAX;
sol[nod]=0;
q.push(mp(nod,0));
while(!q.empty())
{
pair <int,int> x=q.front();
q.pop();
if(sol[x.f]<x.s)continue;
for(int i=0;i<v[x.f].size();i++)
{
nn=v[x.f][i].f;
nd=x.s+v[x.f][i].s;
if(sol[nn]>nd)
{
sol[nn]=nd;
q.push(mp(nn,nd));
}
}
}
}
int main()
{
fin>>n>>m>>k;
for(i=0;i<k;i++)
fin>>c[i];
for(i=1;i<=m;i++)
{
fin>>x>>y>>z;
v[x].push_back(mp(y,z));
v[y].push_back(mp(x,z));
}
dijkstra(1,dr[0]);
for(i=0;i<k;i++)
dijkstra(c[i],dr[i+1]);
if(k==0)
{
fout<<dr[0][n]<<'\n';
return 0;
}
for(i=1;i<(1<<k);i++)
{
for(j=0;j<k;j++)
if(i==1<<j)
break;
if(j<k)
{
dp[i][j]=dr[0][c[j]];
continue;
}
for(j=0;j<k;j++)
{
dp[i][j]=INT_MAX;
if(i&(1<<j))
for(l=0;l<k;l++)
if(l!=j&&(i&(1<<l)))
{
nd=dp[i-(1<<j)][l]+dr[l+1][c[j]];
dp[i][j]=min(dp[i][j],nd);
}
}
}
ans=INT_MAX;
for(i=0;i<k;i++)
ans=min(ans,dp[(1<<k)-1][i]+dr[i+1][n]);
fout<<ans;
return 0;
}