Pagini recente » Cod sursa (job #1936802) | Istoria paginii runda/kk | Cod sursa (job #1142776) | Cod sursa (job #2043917) | Cod sursa (job #2801330)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int dim=2009,inf=1e9;
struct elem{
int y,c;
bool operator <(const elem &a) const
{
return c>a.c;
}
};
vector<elem>v[dim];
priority_queue<elem>q;
int n,m,k,w[20];
int dist[dim][dim];
int dp[1<<17][20];
void dijkstra(int start){
dist[start][start]=0;
q.push({start,0});
while(!q.empty()){
int x=q.top().y;
int c=q.top().c;
q.pop();
if(c==dist[start][x]){
for(auto y:v[x]){
if(c+y.c<dist[start][y.y]){
dist[start][y.y]=c+y.c;
q.push({y.y,dist[start][y.y]});
}
}
}
}
}
signed main(){
fin>>n>>m;
fin>>k;
w[0]=1;
for(int i=1;i<=k;i++){
fin>>w[i];
}
for(int i=1;i<=m;i++){
int x,y,c;
fin>>x>>y>>c;
v[x].push_back({y,c});
v[y].push_back({x,c});
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j]=inf;
}
}
if(k==0){
dijkstra(1);
fout<<dist[1][n];
return 0;
}
for(int i=0;i<=k;i++){
dijkstra(w[i]);
}
for(int i=1;i<=(1<<(k+1));i++){
for(int j=1;j<=k;j++){
dp[i][j]=inf;
dp[1<<j][j]=dist[1][w[j]];
}
}
for(int stare=1;stare<=(1<<(k+1));stare++){
for(int i=1;i<=k;i++){
if(stare&(1<<i)){
for(int j=1;j<=k;j++){
if(!(stare&(1<<j))){
int stare_noua=(stare+(1<<j));
dp[stare_noua][j]=min(dp[stare_noua][j],dp[stare][i]+dist[w[j]][w[i]]);
}
}
}
}
}
int ans=inf;
for(int i=1;i<=k;i++){
ans=min(ans,dp[(1<<(k+1))-2][i]+dist[w[i]][n]);
}
fout<<ans;
}