Pagini recente » Cod sursa (job #2087396) | Cod sursa (job #2909688) | Cod sursa (job #782373) | Cod sursa (job #92303) | Cod sursa (job #2540591)
#include<bits/stdc++.h>
#define maxn 2005
#define inf 1<<30
using namespace std;
queue <int> q;
vector <pair<int,int> > v[maxn];
int n,m,c[maxn],i,x,y,cost,cmb,d[17][17],rez[maxn],sol[(1<<17)][17],k,vec;
ifstream ccin("ubuntzei.in");
ofstream ccout("ubuntzei.out");
void bellman(int x){
for(int i=1; i<=n; i++)
rez[i]=inf;
rez[x]=0;
q.push(x);
while(!q.empty()){
int nod=q.front();
q.pop();
for(int i=0; i<v[nod].size(); i++)
vec=v[nod][i].first, cost=v[nod][i].second;
if(rez[vec]>rez[nod]+cost)
rez[vec]=rez[nod]+vec, q.push(vec);
}
}
int main(){
ccin>>n>>m;
ccin>>k;
for(i=1; i<=k; i++)
ccin>>c[i];
while(m--){
ccin>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
if(!k){
bellman(1);
ccout<<c[n];
return 0;
}
c[0]=1; c[++k]=n;
for(i=0; i<=k; i++){
bellman(c[i]);
for(int j=0; j<=k; j++)
d[i][j]=rez[c[j]];
}
k--;
cmb=(1<<k);
for(i=0; i<=cmb; i++)
for(int j=0; j<=k; j++)
sol[i][j]=inf;
sol[0][0]=0;
for(int x=1; x<cmb; ++x)
for(i=0; i<k; ++i)
if(x&&(1<<i))
for(int j=0, ex=(x-(1<<i)); j<=k; j++)
sol[x][i+1]=min(sol[x][i+1], sol[ex][j]+d[y][i+1]);
int ans=inf;
for(int i=1; i<=k; i++)
ans=min(ans,sol[i][cmb-1]+d[i][k+1]);
ccout<<ans;
return 0;
}