Language: C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ld=long double;
using pll=pair<ll,ll>;
using plll=pair<ll,pll>;
using graph=vector<vector<int>>;
using wgraph=vector<vector<pll>>;

const ll MOD=1000000007;
const int dx[4]={1,0,-1,0};
const int dy[4]={0,1,0,-1};

ll abs1(ll a){
  if(a>=0)return a;
  else return -a;
}

ll pow1(ll a,ll b,ll p=LLONG_MAX){
  ll ret=1;
  while(b!=0){
    if((b&1)==1){
      ret*=a;
    }
    a*=a;
    if(a>=p)a%=p;
    b=b>>1;
  }
  return ret;
}

int digit(ll a,ll b){
  int i=0;
  while(a!=0){
    a/=b;
    i++;
  }
  return i;
}

ll gcd1(ll a,ll b){
  if(a==0 && b==0)return 0;
  ll n;
  while(a%b!=0){
    n=a%b;
    a=b;
    b=n;
  }
  return b;
}

ll solveLinear(ll n,ll m,ll c){
  if(n==0 && m==0)return 0;
  ll a[100],b[100];
  a[0]=n;b[0]=m;
  int i=1;
  while(b[i-1]!=0){
    a[i]=b[i-1];
    b[i]=a[i-1]%b[i-1];
    i++;
  }
  n=i;
  if(c%a[n-1]!=0){
    return 0;
  }
  ll x=c/a[n-1],y=0;
  for(i=1;i<n;i++){
    ll cnt=x;
    x=y;
    y=cnt-(a[n-i-1]/b[n-i-1])*y;
  }
  return x;
}

ll modRev(ll a,ll p=MOD){
  a%=p;
  ll n=solveLinear(a,p,1);
  n%=p;
  if(n<0)return n+p;
  return n;
}

ll fact(ll n,ll p=MOD){
  if(n<0)return 0;
  int i;
  ll ret=1;
  for(i=0;i<n;i++){
    ret=ret*(i+1);
    if(ret>=p)ret%=p;
  }
  return ret;
}

ll perm(ll n,ll k,ll p=MOD){
  if(n<0 || k<0 || n<k)return 0;
  int i;
  ll ret=1;
  for(i=0;i<k;i++){
    ret=ret*(n-i);
    if(ret>=p)ret%=p;
  }
  return ret;
}

ll binom(ll n,ll k,ll p=MOD){
  if(n<0 || k<0 || n<k)return 0;
  int i;
  ll ret=1,fact=1;
  for(i=0;i<k;i++){
    ret=ret*(n-i);
    fact*=i+1;
    if(ret>=p)ret%=p;
    if(fact>=p)fact%=p;
  }
  return (ret*modRev(fact))%p;
}

void pushHeap(vector<int>& h,int n){
  int i=h.size();
  h.push_back(n);
  while(i!=0 && h[(i-1)/2]<h[i]){
    swap(h[i],h[(i-1)/2]);
    i=(i-1)/2;
  }
  h[i]=n;
}

int popHeap(vector<int>& h){
  int n=h.size()-1;
  if(n==-1)return 0;
  int i,ret=h[0];
  swap(h[0],h[n]);
  h.pop_back();
  for(i=0;i<n;){
    int j=2*i+1;
    if(j>=n)break;
    if(j!=n-1 && h[j]<h[j+1])j++;
    if(h[i]<h[j]){
      swap(h[i],h[j]);
    }
    i=j;
  }
  return ret;
}

int bis(vector<int> v,int key){
  int left=-1,right=v.size();
  while(abs1(right-left)>1){
    int mid=left+(right-left)/2;
    if(v[mid]<=key)left=mid;
    else right=mid;
  }
  return left;
}

int l;
int r[8];
vector<int> mi;
const wgraph g(200);
int dfs(int v,int c){
  mi[v]=c;
  for(auto i:g[v]){
    if(c+i.second>=mi[i.first])continue;
    dfs(g,i.first,c+i.second);
  }
}

int main(){
  int i,j,k,cnt=0;
  int n,m;
  cin>>n>>m>>l;
  for(i=0;i<l;i++)cin>>r[i];
  for(i=0;i<l;i++)r[i]--;
  for(i=0;i<m;i++){
    int a,b,c;
    cin>>a>>b>>c;
    a--;b--;
    g[a].push_back(pll(b,c));
    g[b].push_back(pll(a,c));
  }
  ll d[l][l];
  for(i=0;i<l;i++){
    for(j=i+1;j<l;j++){
      mi.assign(n,INT_MAX);
      dfs(g,r[i],0);
      d[i][j]=mi[r[j]];
    }
  }
  vector<int> v(l);
  for(i=0;i<l;i++)v[i]=i;
  ll ans=INT_MAX;
  do{
    ll sum=0;
    for(i=1;i<l;i++){
      if(v[i-1]<v[i])sum+=d[v[i-1]][v[i]];
      else sum+=d[v[i]][v[i-1]];
    }
    ans=min(ans,sum);
  }while(next_permutation(v.begin(),v.end()));
  cout<<ans<<endl;
}


Compiler output:
a.cc: In function 'int dfs(int, int)':
a.cc:164:9: error: cannot convert 'const wgraph' {aka 'const std::vector<std::vector<std::pair<long long int, long long int> > >'} to 'int'
  164 |     dfs(g,i.first,c+i.second);
      |         ^
      |         |
      |         const wgraph {aka const std::vector<std::vector<std::pair<long long int, long long int> > >}
a.cc:160:13: note:   initializing argument 1 of 'int dfs(int, int)'
  160 | int dfs(int v,int c){
      |         ~~~~^
a.cc:166:1: warning: no return statement in function returning non-void [-Wreturn-type]
  166 | }
      | ^
a.cc: In function 'int main()':
a.cc:178:19: error: passing 'const __gnu_cxx::__alloc_traits<std::allocator<std::vector<std::pair<long long int, long long int> > >, std::vector<std::pair<long long int, long long int> > >::value_type' {aka 'const std::vector<std::pair<long long int, long long int> >'} as 'this' argument discards qualifiers [-fpermissive]
  178 |     g[a].push_back(pll(b,c));
      |     ~~~~~~~~~~~~~~^~~~~~~~~~
In file included from /usr/include/c++/14/vector:66,
                 from /usr/include/c++/14/functional:64,
                 from /usr/include/x86_64-linux-gnu/c++/14/bits/stdc++.h:53,
                 from a.cc:1:
/usr/include/c++/14/bits/stl_vector.h:1300:7: note:   in call to 'void std::vector<_Tp, _Alloc>::push_back(value_type&&) [with _Tp = std::pair<long long int, long long int>; _Alloc = std::allocator<std::pair<long long int, long long int> >; value_type = std::pair<long long int, long long int>]'
 1300 |       push_back(value_type&& __x)
      |       ^~~~~~~~~
a.cc:179:19: error: passing 'const __gnu_cxx::__alloc_traits<std::allocator<std::vector<std::pair<long long int, long long int> > >, std::vector<std::pair<long long int, long long int> > >::value_type' {aka 'const std::vector<std::pair<long long int, long long int> >'} as 'this' argument discards qualifiers [-fpermissive]
  179 |     g[b].push_back(pll(a,c));
      |     ~~~~~~~~~~~~~~^~~~~~~~~~
/usr/include/c++/14/bits/stl_vector.h:1300:7: note:   in call to 'void std::vector<_Tp, _Alloc>::push_back(value_type&&) [with _Tp = std::pair<long long int, long long int>; _Alloc = std::allocator<std::pair<long long int, long long int> >; value_type = std::pair<long long int, long long int>]'
 1300 |       push_back(value_type&& __x)
      |       ^~~~~~~~~
a.cc:185:11: error: cannot convert 'const wgraph' {aka 'const std::vector<std::vector<std::pair<long long int, long long int> > >'} to 'int'
  185 |       dfs(g,r[i],0);
      |           ^
      |           |
      |           const wgraph {aka const std::vector<std::vector<std::pair<long long int, long long int> > >}
a.cc:160:13: note:   initializing argument 1 of 'int dfs(int, int)'
  160 | int dfs(int v,int c){
      |         ~~~~^