Cod sursa(job #3298328)

Utilizator savineugenioanSavin Eugen Ioan savineugenioan Data 28 mai 2025 20:14:30
Problema Ubuntzei Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
// 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;
}