Pagini recente » Cod sursa (job #2766315) | Cod sursa (job #1932248) | Cod sursa (job #2091793) | Cod sursa (job #985378) | Cod sursa (job #2253627)
#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();
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=1;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=1;i<=k;i++)
dijkstra(c[i],dr[i]);
if(k==0)
{
fout<<dr[0][n]<<'\n';
}
for(i=1;i<1<<(k+1);i++)
{
for(j=1;j<=k;j++)
if(i==1<<j)
break;
if(j<=k)
{
dp[i][j]=dr[0][j];
continue;
}
for(j=1;j<=k;j++)
{
dp[i][j]=INT_MAX;
if(i&(1<<j))
for(l=1;l<=k;l++)
if(l!=j&&(i&(1<<l)))
{
nd=dp[i-1<<j][k]+dr[k][c[j]];
dp[i][j]=min(dp[i][j],nd);
}
}
}
ans=INT_MAX;
for(i=1;i<=k;i++)
ans=min(ans,dp[(1<<(k+1))-1][i]+dr[i][n]);
fout<<ans;
return 0;
}