Cod sursa(job #2550837)

Utilizator PetyAlexandru Peticaru Pety Data 19 februarie 2020 10:29:38
Problema Ubuntzei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>

using namespace std;



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


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

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


int mat[500][500];

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 <= n; i++) {
    for (int j = 1; j <= n; j++)
      dist[i][j] = -1;
    dist[i][i] = 0;
    memset(inQ, 0, sizeof(inQ));
    inQ[i] = 1;
    priority_queue<int, vector<int>, cmp>pq;
    pq.push(i);
    nod = i;
    while (!pq.empty()) {
      int x = pq.top();
      pq.pop();
      inQ[x] = 0;
      for (auto it : G[x]) {
        if (dist[i][it.first] > dist[i][x] + it.second || dist[i][it.first] == -1) {
          dist[i][it.first] = dist[i][x] + it.second;
          if (inQ[it.first] == 0) {
            inQ[it.first] = 1;
            pq.push(it.first);
          }
        }
      }
    }
  }
  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[a[t]][a[j]] != -1)
              mask[i][j] = min(mask[i][j], dist[a[t]][a[j]] + mask[newMask][t]);
      }
  }
  fout << mask[(1 << k) - 1][k];
  return 0;
}