fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define faster ios_base::sync_with_stdio(false); cin.tie(NULL)
  4. #define Bit(mask , i) ((mask >> i) & 1)
  5. #define fi first
  6. #define se second
  7. #define _LOG2(nl) 31 - __builtin_clz(nl)
  8. #define c_bit(nl) __builtin_popcount(nl)
  9. #define ii pair<int , pair<int , int>>
  10. #define lii pair<long long , pair<int , int>>
  11. #define li pair<long long , int>
  12. #define db double
  13. #define onBit(mask , i) (mask | (1 << i))
  14. #define offBit(mask , i) (mask & (~(1 << i)))
  15.  
  16. const long long INF = 1e16;
  17. const int N = 1e5 + 7;
  18. int n , m , k;
  19. int K[10] , col[N];
  20. vector<pair<int , long long>> a[N];
  21. long long dist[N][37];
  22.  
  23. void inp(){
  24. cin >> n >> k >> m;
  25. for (int i = 1 ; i <= k ; ++i){
  26. cin >> K[i];
  27. col[K[i]] = i;
  28. }
  29. for (int i = 1 ; i <= m ; ++i){
  30. int u , v;
  31. long long w;
  32. cin >> u >> v >> w;
  33. a[u].push_back({v , w});
  34. a[v].push_back({u , w});
  35. }
  36. }
  37.  
  38. void dijkstra(){
  39. priority_queue<lii , vector<lii> , greater<lii>> pq;
  40. pq.push({0 , {K[1] , 1}});
  41. for (int i = 1 ; i <= n ; ++i){
  42. for (int mask = 1 ; mask < (1 << k) ; ++mask){
  43. dist[i][mask] = INF;
  44. }
  45. }
  46. dist[K[1]][1] = 0;
  47. while (pq.size()){
  48. lii val = pq.top();
  49. pq.pop();
  50.  
  51. int u = val.se.fi , mask = val.se.se;
  52. long long d_u = val.fi;
  53. if (d_u > dist[u][mask]) continue;
  54. for (auto &c : a[u]){
  55. int v = c.fi;
  56. long long w = c.se;
  57. int n_mask = mask;
  58. if (col[v] != 0) n_mask = onBit(n_mask , col[v] - 1);
  59. if (dist[v][n_mask] > dist[u][mask] + w){
  60. dist[v][n_mask] = dist[u][mask] + w;
  61. pq.push({dist[v][n_mask] , {v , n_mask}});
  62. }
  63. }
  64. }
  65. }
  66.  
  67. void solve(){
  68. dijkstra();
  69. long long res = INF;
  70. for (int i = 1 ; i <= n ; ++i){
  71. res = min(res , dist[i][(1 << k) - 1]);
  72. }
  73. cout << res;
  74. }
  75.  
  76. int main(){
  77. if (fopen("cau4.inp" , "r")){
  78. freopen("cau4.inp" , "r" , stdin);
  79. freopen("cau4.out" , "w" , stdout);
  80. }
  81. faster;
  82. inp();
  83. solve();
  84. return 0;
  85. }
  86.  
Success #stdin #stdout 0.01s 7240KB
stdin
Standard input is empty
stdout
10000000000000000