Pagini recente » Cod sursa (job #3226576) | Cod sursa (job #3290353) | Cod sursa (job #2946355) | Cod sursa (job #665725) | Cod sursa (job #3298328)
// https://www.pbinfo.ro/probleme/1069/ubuntzei
#include <iostream>
#include <fstream>
#include <unordered_set>
using namespace std;
int kk, n, m;
unordered_set<int> c;
int sosele[2000][2000];
int maxHex = 1000000000;
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
cin >> n >> m;
cin >> kk;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
sosele[i][j] = maxHex;
}
}
for (int i = 0; i < kk; i++) {
int a; cin >> a;
c.insert(a);;
}
c.insert(n);
for (int i = 0; i < m; i++) {
int x, y, z;
cin >> x >> y >> z;
sosele[x][y] = z;
}
for (int k = 1; k <= n; k++) {
sosele[k][k] = 0;
}
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ( i != j && ( sosele[i][j] > sosele[i][k] + sosele[k][j] )) {
sosele[i][j] = sosele[i][k] + sosele[k][j];
}
}
}
}
int poz = 1;
int nearest;
int l = 0;
while (!c.empty()) {
int dist = maxHex;
for (int elem : c) {
if (sosele[poz][elem] < dist) {
if (elem == n && c.size() > 1) {
continue;
}
nearest = elem;
dist = sosele[poz][elem];
}
}
l += dist;
poz = nearest;
c.erase(nearest);
}
cout << l;
}