Pagini recente » Cod sursa (job #71536) | Cod sursa (job #1038654) | Cod sursa (job #1840072) | Cod sursa (job #2215400) | Cod sursa (job #1317395)
#include<cstdio>
#include<queue>
#define INF 999999999
#define NMAX 2005
using namespace std;
int n,m,k,i,x,y,c,s,j,K;
int o[30],d[30][30],cst[NMAX];
int dp[20][1<<15];
typedef pair<int,int>pp;
priority_queue<pp,vector<pp>,greater<pp> >q;
vector<pp>v[NMAX];
void djikstra(int nr)
{
int i;
for (i=1;i<=n;++i) cst[i]=INF;
q.push(pp(o[nr],0));
cst[o[nr]]=0;
while(!q.empty())
{
pp X=q.top();
q.pop();
int x=X.first, c=X.second;
if (c>cst[x]) continue;
for (i=0; i<v[X.first].size(); ++i)
{
int it=v[x][i].first;
int cost=v[x][i].second;
if (cst[it] > cst[x]+cost)
{
cst[it]=cst[x]+cost;
q.push(pp(it,cst[it]));
}
}
}
for (i=0;i<=k+1;++i) d[nr][i]=cst[o[i]];
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d",&k);
for (i=1;i<=k;++i) scanf("%d",&o[i]);
o[0]=1;o[k+1]=n;
for (i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
v[x].push_back(pp(y,c));
v[y].push_back(pp(x,c));
}
for (i=0;i<=k+1;++i)
djikstra(i);
if (k==0) {printf("%d\n",d[0][k+1]);}
else
{
int S=(1<<k);
for (i=0;i<=k+1;++i)
for (j=0;j<S;++j) dp[i][j]=INF;
dp[0][0]=0;
for (s=0;s<S;++s)
for (j=0;j<=k;++j)
if (dp[j][s]!=INF)
{
for (i=1;i<=k;++i)
{
x=1<<(i-1);
if ((s & x)==0)
dp[i][1<<(i-1)|s]=min(dp[i][1<<(i-1)|s],dp[j][s]+d[j][i]);
}
}
int Min=INF;
for (i=1;i<=k;++i)
Min=min(Min,dp[i][S-1]+d[i][k+1]);
printf("%d\n",Min);
}
return 0;
}