Pagini recente » Cod sursa (job #2913406) | Cod sursa (job #2214290) | Cod sursa (job #2189019) | Cod sursa (job #3240445) | Cod sursa (job #1070982)
//horatiu11
# include <cstdio>
# include <iostream>
# include <vector>
# include <queue>
# include <cstring>
# define nmax 2002
# define inf 2e9
# define kmax 21
using namespace std;
int c[kmax],n,m,k,x,K,y,z,D[kmax][nmax],l,DP[1<<kmax][kmax];
vector <pair <int,int> >G[nmax];
queue <int>q;
void bellman_ford(int x)
{
int i;
q.push(x);D[k][x]=0;
while(!q.empty())
{
x=q.front();q.pop();
for(i=0;i<G[x].size();++i)
if(D[k][G[x][i].first] > D[k][x]+G[x][i].second)
{
D[k][G[x][i].first] = D[k][x]+G[x][i].second;
q.push(G[x][i].first);
}
}
}
int main()
{
int i,j,b;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&K);
for(i=1;i<=K;++i)
scanf("%d",&c[i]);
c[++K]=n;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
for(k=1;k<=K;++k)
{
for(j=1;j<=n;++j)
D[k][j]=inf;
bellman_ford(c[k]);
}
l=1<<K;
for(i=0;i<l;++i)
for(j=0;j<=K;++j)
DP[i][j]=inf;
k=K+1;
for(i=1;i<=n;++i)
D[k][i]=inf;
bellman_ford(1);
for(i=0;(1<<i)<l;++i)
DP[1<<i][i]=D[K+1][c[i+1]];
for(i=1;i<l;++i)
for(j=0;j<K;++j)
if(i&(1<<j))
for( b=0;b<K;++b)
if (b!=j && (i&(1<<b)))
DP[i][j]=min(DP[i][j],DP[i ^ (1 << j)][b] + D[b + 1][c[j + 1]]);
printf ("%d\n", DP[l - 1][K - 1]);
return 0;
}