Cod sursa(job #2519758)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 8 ianuarie 2020 13:34:34
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

#define NMAX 2000
#define MMAX 10000
#define pii pair<int, int>

using namespace std;

int n, m, k, ltot, last;
int prieten[NMAX + 5], calc[NMAX + 5];
int dmin[NMAX + 5];
vector<pii> v[NMAX + 5];
priority_queue<pii, vector<pii>, greater<pii>> pq;

int dijkstra(int start) {
  for(int i = 1; i <= n; i++)
    dmin[i] = MMAX * 100000 + 5;

  pq.push({0, start});
  while(!pq.empty()) {
    while(!pq.empty() && dmin[pq.top().second] <= pq.top().first)
      pq.pop();
    pii crt = pq.top();
    pq.pop();
    dmin[crt.second] = crt.first;

    if((last && crt.second == n) || (prieten[crt.second] && !calc[crt.second])) /// daca am luat toti prietenii si am ajuns sau am gasit un nou prieten
      return crt.second;

    for(pii x: v[crt.second])
      if((last || x.first != n) && crt.first + x.second < dmin[x.first])
        pq.push({crt.first + x.second, x.first});
  }
}

int main() {
  freopen("ubuntzei.in", "r", stdin);
  freopen("ubuntzei.out", "w", stdout);
  int x, y, l, crt;

  scanf("%d %d %d ", &n, &m, &k);
  for(int i = 1; i <= k; i++) {
    scanf("%d", &x);
    prieten[x] = 1;
  }

  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &x, &y, &l);
    v[x].push_back({y, l});
    v[y].push_back({x, l});
  }

  crt = 1;
  for(int i = 1; i <= k; i++) {
    crt = dijkstra(crt);
    calc[crt] = 1;
    ltot += dmin[crt];
  }

  last = 1;
  crt = dijkstra(crt);
  ltot += dmin[crt];
  printf("%d", ltot);

  return 0;
}