Pagini recente » Cod sursa (job #1635749) | Cod sursa (job #1628031) | Cod sursa (job #2055359) | Cod sursa (job #656776) | Cod sursa (job #2572033)
include<bits/stdc++.h>
#define maxn 2005
#define maxk 20
#define inf 1000000000
using namespace std;
int cost[maxn],p[maxk],drum[maxk][maxk],n,m,k,sol[(1<<17)][17];
vector <pair<int,int> > v[maxn];
queue <int> q;
ifstream ccin("ubuntzei.in");
ofstream ccout("ubuntzei.out");
void bellman(int nod){
for(int i=1; i<=n; i++)
cost[i]=inf;
cost[nod]=0;
q.push(nod);
while(!q.empty()){
nod=q.front();
q.pop();
for(int i=0; i<v[nod].size(); i++)
if(cost[v[nod][i].first]>cost[nod]+v[nod][i].second)
cost[v[nod][i].first]=cost[nod]+v[nod][i].second, q.push(v[nod][i].first);
}
}
int main(){
ccin>>n>>m>>k;
for(int i=1; i<=k; i++)
ccin>>p[i];
int x,y,c;
while(m--){
ccin>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
if(k==0){
bellman(1);
ccout<<cost[n];
return 0;
}
p[0]=1; p[++k]=n;
for(int i=0; i<=k; i++){
bellman(p[i]);
for(int j=0; j<=k; j++)
drum[i][j]=cost[p[j]];
}
k--;
int bit=1<<k;
for(int i=0; i<=bit; i++)
for(int j=0; j<=k; j++)
sol[i][j]=inf;
sol[0][0]=0;
for(int i=0; i<bit; i++)
for(int j=0; j<k; j++)
if(i&(1<<j))
for(int x=0, exc=(i-(1<<j)); x<=k; x++)
sol[i][j+1]=min(sol[i][j+1], sol[exc][x]+drum[x][j+1]);
int rez=inf;
for(int i=1; i<=k; i++)
rez=min(rez,sol[bit-1][i]+drum[i][k+1]);
ccout<<rez;
return 0;
}