Pagini recente » Cod sursa (job #1697792) | Cod sursa (job #2286734) | Cod sursa (job #1509059) | Cod sursa (job #2634342) | Cod sursa (job #2519758)
#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;
}