Pagini recente » Cod sursa (job #2412345) | Cod sursa (job #146890) | Cod sursa (job #2005727) | Cod sursa (job #578370) | Cod sursa (job #2305714)
#include <bits/stdc++.h>
#define N 16
#define NX 2001
#define INF 100000001
#define ll long long
#define f first
#define s second
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int M=1;
int dp[1<<N][NX], C[NX][NX], n, m, k;
bool v[NX], p[NX];
short P[N], nr2[N], nr[NX],a[NX][NX], r[N][N];
int c[NX][NX];
pair<int,short> h[NX*NX];
void dij(int o){//cout<<o<<": \n";
int i,j,k=0;
int cur;
while(h[0].f!=-M){
i=h[0].s;
cur=-h[0].f;
h[0].f=-M;
pop_heap(h, h+k+1);
while(!v[i]){// cout<<i<<" "<<cur<<"\n";
v[i]=1;
if(p[i] && !C[i][o] && i!=o){
r[o][++nr2[o]]=i;
r[i][++nr2[i]]=o;
C[o][i]=C[i][o]=cur;
}
for(j=1; j<=nr[i]; ++j){
if(!v[a[i][j]]){
h[++k].f=-(cur+c[i][a[i][j]]*1LL);
h[k].s=a[i][j];
push_heap(h,h+k+1);
}
}
}
}
}
int main(){
int x,y,w,i,j,o;
in>>n>>m>>k;
P[1]=1;
P[2]=n;
p[1]=p[n]=1;
k+=2;
for(i=3; i<=k; ++i)
in>>P[i], p[P[i]]=1;
for(i=1; i<=m; ++i){
in>>x>>y>>w;
a[x][++nr[x]]=y;
a[y][++nr[y]]=x;
c[x][y]=c[y][x]=w;
M+=w*2;
}
for(i=1; i<=k; ++i){
h[0].f=0;
h[0].s=P[i];
dij(P[i]);
for(j=1; j<=n; ++j)
v[j]=0;
}
for(i=0; i< (1<<k); ++i)
for(j=0; j<k; ++j)
if(i&(1<<j))
for(o=1; o<=nr2[P[j+1]]; ++o)
if(i&(1<<r[P[j+1]][o]))
dp[i][j]=(!dp[i][j] ? dp[i^(1<<j)][r[P[j+1]][o]]+C[P[j+1]][r[P[j+1]][o]] : min(dp[i][j], dp[i^(1<<j)][r[P[j+1]][o]]+C[P[j+1]][r[P[j+1]][o]]));
out<<dp[(1<<k)-1][k-1];
return 0;
}