Cod sursa(job #2575195)

Utilizator Yato2Denis Scutariu Yato2 Data 6 martie 2020 12:02:45
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;

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

int n, m, start, inf = (1 << 30), d[2005], k, vec[17], suma, gasit;
bool viz[2005], ok[2005];
struct muchie {
    int x, y;
};
vector <muchie> v[10010];
struct comp {
    bool operator() (int x, int y) {
        return d[x] > d[y];
    }
};
priority_queue <int, vector <int>, comp> Q;

void dijkstra(int start_node) {

    for(int i = 1; i <= n; ++i){
        d[i] = inf;
        viz[i] = 0;
    }
    d[start_node] = 0;
    Q.push(start_node);
    viz[start_node] = 1;
    while(!Q.empty()) {
        int node_curent = Q.top();
        Q.pop();
        viz[node_curent] = 0;
        for(unsigned int i = 0; i < v[node_curent].size(); ++i) {
            int value = v[node_curent][i].y;
            int vecin = v[node_curent][i].x;
            if(d[vecin] > d[node_curent] + value){
                d[vecin] = d[node_curent] + value;
                if(!viz[vecin])
                    Q.push(vecin), viz[vecin] = 1;
            }
        }
    }
}

int main() {

    in >> n >> m >> k;
    for(int i = 1; i <= k; ++i)
        in >> vec[i];
    for(int i = 1; i <= m; ++i) {
        int a, b, val;
        in >> a >> b >> val;
        v[a].push_back({b, val});
        v[b].push_back({a, val});
    }
    dijkstra(1);
    ok[1] = 1;
    while(true) {
        int minim = (1 << 30), posmn;
        gasit = 0;
        for(int i = 1; i <= k; ++i) {
            if(!ok[vec[i]]) {
                if(minim > d[vec[i]]) {
                    minim = d[vec[i]];
                    posmn = vec[i];
                    gasit = 1;
                }
            }
        }
        if(gasit == 1){
            ok[posmn] = 1;
            suma += d[posmn];
            dijkstra(posmn);
        }
        else 
            break;
    }
    out << suma + d[n];
    return 0;
}