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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
#include<bits/stdc++.h> using namespace std;
const int N=810, M=3000, INF=0x3f3f3f3f;
int n, p, m; int h[N], e[M], w[M], ne[M], idx; int id[N]; int dist[N], q[M]; bool st[N];
void add(int a,int b,int c){ e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++; }
int spfa(int start){
memset(dist,0x3f,sizeof dist); dist[start]=0;
int hh=0,tt=1; q[0]=start,st[start]=true;
while(hh!=tt){ int t=q[hh++]; if(hh==N) hh=0; st[t]=false;
for(int i=h[t];~i;i=ne[i]){ int j=e[i]; if(dist[j]>dist[t]+w[i]){ dist[j]=dist[t]+w[i]; if(!st[j]){ q[tt++]=j; if(tt==N) tt=0; st[j]=true; } } } }
int res=0; for(int i=0;i<n;i++){
int j=id[i]; if(dist[j]==INF){ res=INF; break; } else res+=dist[j]; }
return res; }
void work(){ cin>>n>>p>>m;
for(int i=0;i<n;i++) cin>>id[i];
memset(h,-1,sizeof h); for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c;
add(a,b,c),add(b,a,c); }
int res=INF; for(int i=1;i<=p;i++) res=min(res, spfa(i));
cout<<res<<endl; }
int main(){ work(); return 0; }
|