Cod sursa(job #2534706)

Utilizator lucametehauDart Monkey lucametehau Data 30 ianuarie 2020 21:13:25
Problema Ubuntzei Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream cin ("ubuntzei.in");
ofstream cout ("ubuntzei.out");

int n, m, k, x, y, z;

int loc[20], ind[2005];
vector <pair <int, int>> g[2005];
int dp[2005][32770];

int main() {
  cin >> n >> m >> k;
  for(int i = 1; i <= k; i++)
    cin >> loc[i];
  sort(loc + 1, loc + k + 1);
  for(; m; m--) {
    cin >> x >> y >> z;
    g[x].push_back({y, z});
    g[y].push_back({x, z});
  }
  for(int i = 1; i <= n; i++) {
    for(int j = 0; j < (1 << k); j++)
      dp[i][j] = (int)1e9;
  }
  dp[1][0] = 0;
  int p = 1;
  for(int i = 1; i <= n; i++) {
    if(loc[p] == i)
      ind[i] = p - 1, p++;
    else
      ind[i] = k;
  }
  for(int j = 0; j < (1 << k); j++) {
    for(int i = 1; i <= n; i++) {
      if(j & (1 << ind[i])) {
        for(auto &son : g[i])
          dp[i][j] = min(dp[i][j], dp[son.first][j ^ (1 << ind[i])] + son.second);
      } else {
        for(auto &son : g[i])
          dp[i][j] = min(dp[i][j], dp[son.first][j] + son.second);
      }
    }
  }
  cout << dp[n][(1 << k) - 1];
  return 0;
}