Pagini recente » Cod sursa (job #2834364) | Cod sursa (job #2620361) | Cod sursa (job #2378060) | Cod sursa (job #193237) | Cod sursa (job #2336116)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
#define maxn 2002
#define pb push_back
#define f first
#define s second
const int inf=0x3f3f3f3f;
int n,m,k,v[maxn],dj[maxn],c[maxn],d[17][17],SOL[(1<<17)][17];
vector<pair<int,int>> g[maxn];
queue<int> q;
inline int min(int a,int b){if(a<b)return a; return b;}
void dijk(int);
int main()
{
int i,x,y,cos,cmb,excluded;
cin>>n>>m>>k;
for(i=1;i<=k;++i)
cin>>i[c];
for(;m--;){
cin>>x>>y>>cos;
g[x].pb({y,cos});
g[y].pb({x,cos});
}
if(!k){
dijk(1);
cout<<dj[n];
return 0;
}
++k;
c[0]=1,c[k]=n;
for(i=0;i<=k;++i){
dijk(c[i]);
for(x=0;x<=k;++x)
d[i][x]=dj[c[x]];
}
--k;
cmb=(1<<k);
for(x=0;x<=cmb;++x)
for(i=0;i<=k;++i)
SOL[x][i]=inf;
SOL[0][0]=0;
for(x=1;x<cmb;++x)
for(i=0;i<k;++i)
if(x&(1<<i))
for(y=0,excluded=(x-(1<<i));y<=k;++y)
SOL[x][i+1]=min(SOL[x][i+1],SOL[excluded][y]+d[y][i+1]);
int sol=inf;
for(i=1;i<=k;++i)
if(sol>SOL[x-1][i]+d[i][k+1])
sol=SOL[x-1][i]+d[i][k+1];
cout<<sol;
}
void dijk(int x){
int nod,i;
q.push(x);
for(i=1;i<=n;++i)
i[dj]=inf;
x[dj]=0;
while(!q.empty()){
nod=q.front();
q.pop();
for(auto it:g[nod])
if(dj[it.f]>nod[dj]+it.s)
dj[it.f]=*(nod+dj) + it.s, q.push(it.f);
}
}