Pagini recente » Cod sursa (job #1299832) | Cod sursa (job #67052) | Cod sursa (job #1523115) | Cod sursa (job #745294) | Cod sursa (job #3200528)
#include <bits/stdc++.h>
#define DIM 10000
#define INF 2*(1e9)
#define int long long
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, k, a, b, c, nod, vecin, cost_vecin, last, ans=1e9;
int drum[17][DIM], prieten[16], dp[16][4*DIM];
int i, j, mask;
vector <pair <int, int> > G[DIM];
set <pair <int, int> > s;
void dijkstra(int pos, int start){
for(j=1; j<=n; j++)
drum[pos][j]=INF;
drum[pos][start]=0;
s.insert(make_pair(0, start));
while(!s.empty()){
nod=s.begin()->second;
s.erase(s.begin());
for(auto v:G[nod]){
vecin=v.first;
cost_vecin=v.second;
if(drum[i][vecin]>drum[i][nod]+cost_vecin){
s.erase({drum[i][vecin], vecin});
drum[i][vecin]=drum[i][nod]+cost_vecin;
s.insert({drum[i][vecin], vecin});
}
}
}
}
int32_t main(){
fin>>n>>m>>k;
prieten[0]=1;
for(i=1; i<=k; i++){
fin>>prieten[i];
}
for(i=1; i<=m; i++){
fin>>a>>b>>c;
G[a].push_back(make_pair(b, c));
G[b].push_back(make_pair(a, c));
}
for(i=0; i<=k; i++)
dijkstra(i, prieten[i]);
if(k==0){
fout<<drum[1][n];
return 0;
}
for(i=1; i<=k; i++){
for(mask=1; mask<(1LL<<k); mask++)
dp[i][mask]=INF;
dp[i][1LL<<(i-1)]=drum[i][1];
}
for(mask=1; mask<(1LL<<k); mask++){
for(i=1; i<=k; i++){
if(dp[i][mask]!=INF)
for(j=1; j<=k; j++){
if(!((mask>>(j-1))&1) && i!=j){
dp[i][(mask+(1LL<<(j-1)))]=min(dp[i][(mask>>(j-1))], dp[i][mask]+drum[j][prieten[j]]);
}
}
}
}
for(i=1; i<=k; i++)
ans=min(ans, dp[i][(1LL<<k)-1]+drum[i][n]);
fout<<ans;
}