Pagini recente » Cod sursa (job #936723) | Cod sursa (job #2110754) | Cod sursa (job #2524974) | Cod sursa (job #1558724) | Cod sursa (job #2481724)
#include <fstream>
#include <climits>
#include <cstring>
#include <vector>
#include <queue>
#define inf INT_MAX
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,i,j,x,y,st,c;
int v[20],d[20][2005],dp[20][(1<<15)+1];
bool viz[2005];
struct arc{
int nod,cost;
};
vector <arc> g[2005];
struct cmp{
bool operator()(arc &a, arc &b){
return a.cost>b.cost;
}
};
priority_queue <arc, vector<arc>, cmp> h;
void dijkstra(int poz){
int s=v[poz];
for(int j=1;j<=n;j++)
d[poz][j]=inf;
d[poz][s]=0;
h.push({s,0});
memset(viz,0,sizeof(viz));
while(!h.empty()){
arc p=h.top();
h.pop();
int nod=p.nod;
if(viz[nod])
continue;
viz[nod]=1;
for(int j=0;j<g[nod].size();j++){
int nou=g[nod][j].nod;
int cost=g[nod][j].cost;
if(d[poz][nou]>d[poz][nod]+cost&&viz[nou]==0){
d[poz][nou]=d[poz][nod]+cost;
h.push({nou,d[poz][nou]});
}
}
}
}
int main()
{
fin>>n>>m>>k;
for(i=1;i<=k;i++)
fin>>v[i];
for(i=1;i<=m;i++){
fin>>x>>y>>c;
g[x].push_back({y,c});
g[y].push_back({x,c});
}
for(i=1;i<=k;i++)
dijkstra(i);
for(i=1;i<=k;i++){
for(j=1;j<(1<<k);j++)
dp[i][j]=inf;
dp[i][(1<<(i-1))]=d[i][1];
}
for(st=1;st<(1<<k);st++)
for(i=1;i<=k;i++)
if(dp[i][st]!=inf){
for(j=1;j<=k;j++)
if(j!=i && ((st>>(j-1))&1)==0){
int stare=(st|(1<<(j-1)));
dp[j][stare]=min(dp[j][stare],dp[i][st]+d[j][v[i]]);
}
}
int mn=inf;
for(i=1;i<=k;i++)
mn=min(mn,dp[i][(1<<k)-1]+d[i][n]);
fout<<mn;
return 0;
}