Cod sursa(job #2550797)

Utilizator PetyAlexandru Peticaru Pety Data 19 februarie 2020 09:54:57
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>

using namespace std;



ifstream fin ("ubuntzei.in");
ofstream fout ("ubuntzei.out");

int n, m, dp[(1 << 17)], dist[2002][2002], k, a[2002], x, y, d, inQ[2002];
vector<pair<int, int> >G[2002];

struct cmp {
  bool operator() (const int &a, const int &b) const {
    return dist[a] > dist[b];
  }
};

void dijkstra (int x, int dist[]) {
  for (int i = 1; i <= n; i++)
    dist[i] = -1;
  dist[x] = 0;
  memset(inQ, 0, sizeof(inQ));
  inQ[x] = 1;
  priority_queue<int, vector<int>, cmp>pq;
  pq.push(x);
  while (!pq.empty()) {
    int x = pq.top();
    pq.pop();
    inQ[x] = 0;
    for (auto it : G[x]) {
      if (dist[it.first] > dist[x] + it.second || dist[it.first] == -1) {
        dist[it.first] = dist[x] + it.second;
        if (inQ[it.first] == 0) {
          inQ[it.first] = 1;
          pq.push(it.first);
        }
      }
    }
  }
}

int mask[(1 << 17)][18];

int main()
{
  fin >> n >> m;
  fin >> k;
  for (int i = 1; i <= k; i++)
    fin >> a[i];
  for (int i = 1; i <= m; i++) {
    fin >> x >> y >> d;
    G[x].push_back({y, d});
    G[y].push_back({x, d});
  }
  a[k + 1] = 1;
  a[k + 2] = n;
  sort(a + 1, a + k + 3);
  k += 2;
  for (int i = 1; i <= k; i++) {
    dijkstra(a[i], dist[i]);
  }
  for (int i = 0; i < (1 << k); i++)
    for (int j = 1; j <= k; j++)
      mask[i][j] = 1e9;
  mask[1][1] = 0;
  for (int i = 1; i < (1 << k); i++) {
    if (!(i % 2))
      continue;
    for (int j = 1; j <= k; j++)
      if (i & (1 << (j - 1)) && mask[i][j] == 1e9 && j != 1) {
        int newMask = (i ^ (1 << (j - 1)));
        for (int t = 1; t <= k; t++)
          if (newMask & (1 << (t - 1)) && mask[newMask][t] != 1e9)
            if (dist[t][j] != -1)
              mask[i][j] = dist[t][a[j]] + mask[newMask][t];
      }
  }
  fout << mask[(1 << k) - 1][k];
  return 0;
}