1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include<bits/stdc++.h> using namespace std; #define ll long long typedef pair<int,int> P; ll n,m,k,key[15],head[105],cnt=1,dp[105][2000]; struct edge{ ll to,next,w; }e[1005]; struct node{ ll val,pos; bool operator <(const node &a)const{ return val>a.val; } }tmp; void make(ll u,ll v,ll w){ e[cnt].next=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt++; } priority_queue<node> q; void dij(ll s){ while(!q.empty()){ tmp=q.top(); q.pop(); ll p=tmp.pos; if(tmp.val<dp[p][s])continue; for(int i=head[p];i;i=e[i].next){ if(dp[p][s]+e[i].w<dp[e[i].to][s]){ dp[e[i].to][s]=dp[p][s]+e[i].w; tmp.pos=e[i].to; tmp.val=dp[e[i].to][s]; q.push(tmp); } } } } int main(){ scanf("%lld%lld%lld",&n,&m,&k); ll u,v,w; for(int i=1;i<=m;i++){ scanf("%lld%lld%lld",&u,&v,&w); make(u,v,w); make(v,u,w); } for(int i=1;i<=n;i++){ for(int j=0;j<=(1<<k);j++){ dp[i][j]=1e18; } } for(int i=1;i<=k;i++){ scanf("%lld",&key[i]); dp[key[i]][1<<(i-1)]=0; } for(int i=1;i<(1<<k);i++){ for(int j=1;j<=n;j++){ for(int o=(i-1)&i;o;o=(o-1)&i){ dp[j][i]=min(dp[j][i],dp[j][o]+dp[j][i^o]); } if(dp[j][i]!=1e18){tmp.pos=j,tmp.val=dp[j][i],q.push(tmp);} } dij(i); } printf("%lld",dp[key[1]][(1<<k)-1]); return 0; }
|