Pagini recente » Cod sursa (job #2580144) | Cod sursa (job #2135487) | Cod sursa (job #1083649) | Cod sursa (job #2028612) | Cod sursa (job #1518743)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
const int LIM=2003, INF=(1<<30);
int n, m, k, c[18], dp[LIM], lin=-1, mat[18][18], dp2[1<<18][18];
vector < pair <int, int> > gr[LIM];
queue <int> q;
void bellman(int nod)
{
for(int i=1; i<=n; ++i) dp[i]=INF;
dp[nod]=0;
q.push(nod);
while(!q.empty())
{
nod=q.front();
q.pop();
for(int i=0; i<gr[nod].size(); ++i)
{
int dest=gr[nod][i].first, w=gr[nod][i].second;
if(dp[dest]>dp[nod]+w)
{
dp[dest]=dp[nod]+w;
q.push(dest);
}
}
}
lin++;
for(int i=1; i<=k; ++i)
mat[lin][i-1]=dp[ c[i] ];
}
int hamilton()
{
for(int i=0; i<(1<<k); ++i)
for(int j=0; j<k; ++j)
dp2[i][j]=INF;
dp2[1][0]=0;
for(int i=2; i<(1<<k); ++i)
for(int j=1; j<k; ++j)
if(i&(1<<j))
for(int l=0; l<k; ++l)
if(i&(1<<l))
dp2[i][j]=min(dp2[i][j], dp2[ i^(1<<j) ][l]+mat[l][j]);
return dp2[ (1<<k)-1 ][k-1];
}
int main()
{
cin>>n>>m>>k;
c[1]=1, k++;
for(int i=2; i<=k; ++i)
cin>>c[i];
c[++k]=n;
for(int i=1; i<=m; ++i)
{
int x, y, w;
cin>>x>>y>>w;
gr[x].push_back({y, w});
gr[y].push_back({x, w});
}
for(int i=1; i<=k; ++i)
bellman(c[i]);
cout<<hamilton();
return 0;
}