Pagini recente » Cod sursa (job #1477878) | Cod sursa (job #1356229) | Cod sursa (job #2274315) | Cod sursa (job #1889674) | Cod sursa (job #2519305)
#include <bits/stdc++.h>
#define dim 2007
#define inf 2000000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector < pair<int,int> > L[dim];
set<pair<int,int> > s;
int n,k,q[dim],m,i,x,y,z,K[20];
int d[17][dim],j,dp[17][(1<<15)+30];
void dijkstra(int dist,int nod,int d[])
{
int i,vecin,D;
s.clear();
s.insert({0,nod});
for(i=1;i<=n;i++)
d[i]=inf;
d[nod]=0;
while(s.size()>0){
dist=s.begin()->first;
nod=s.begin()->second;
s.erase(s.begin());
for(i=0;i<L[nod].size();i++){
vecin=L[nod][i].first;
D=L[nod][i].second;
if(d[vecin]>D+dist){
s.erase({d[vecin],vecin});
d[vecin]=D+dist;
s.insert({d[vecin],vecin});
}
}
}
}
int main()
{
fin>>n>>m>>k;
for(i=1; i<=k; i++)
{
fin>>x;
K[i]=x;
}
for(i=1; i<=m; i++)
{
fin>>x>>y>>z;
L[x].push_back({y,z});
L[y].push_back({x,z});
}
/// distanta nod stare
dijkstra(0,1,d[0]);
for(i=1;i<=k;i++){
dijkstra(0,K[i],d[i]);
}
for(i=1;i<=k;i++){
for(j=0;j<(1<<k);j++)
dp[i][j]=inf;
// cout<<K[i]<<endl;
dp[i][(1<<(i-1))]=d[0][K[i]];
}
for(int stare=1;stare<(1<<k);stare++){
for(int j=1;j<=k;j++){
if(dp[j][stare]!=inf){
for(int bit=1;bit<=k;bit++){
if((stare>>(bit-1))%2==0){
int ns=stare;
ns|=(1<<(bit-1));
dp[bit][ns]=min(dp[bit][ns],d[j][K[bit]]+dp[j][stare]);
}
}
}
}
}
int sol=inf;
for(i=1;i<=k;i++){
sol=min(sol,dp[i][(1<<k)-1]+d[i][n]);
}
if(k==0)
sol=d[0][n];
fout<<sol;
}