Pagini recente » Cod sursa (job #2090628) | Cod sursa (job #1628498) | Cod sursa (job #535501) | Cod sursa (job #2184688) | Cod sursa (job #2305742)
#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<<29;
int dp[1<<N][NX], C[N][N], n, m, k, v[NX];
short P[N];
vector< pair<int,short> > a[NX];
pair<int,short> h[NX*NX];
void dij(){
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);
--k;
if(v[i]<0){
v[i]=-v[i];
for(auto it:a[i]){
if(!v[it.s] || cur+it.f<-v[it.s]){
h[++k].f=-(cur+it.f);
v[it.s]=-(cur+it.f);
h[k].s=it.s;
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;
k+=2;
for(i=3; i<=k; ++i)
in>>P[i];
for(i=1; i<=m; ++i){
in>>x>>y>>w;
a[x].push_back({w,y});
a[y].push_back({w,x});
}
for(i=1; i<=k; ++i){
h[0].f=-1;
v[P[i]]=-1;
h[0].s=P[i];
dij();
for(j=1; j<=k; ++j)
C[i-1][j-1]=v[P[j]]-1;
memset(v, 0, sizeof(v));
}
for(i=0; i< (1<<k); ++i)
for(j=0; j<k; ++j)
if(i&(1<<j))
for(o=0; o<k; ++o)
if((i&(1<<o)) && (o!=j))
dp[i][j]=(!dp[i][j] ? dp[i^(1<<j)][o]+C[j][o] : min(dp[i][j], dp[i^(1<<j)][o]+C[j][o]));
out<<dp[(1<<k)-1][k-1];
return 0;
}