Cod sursa(job #2575396)

Utilizator Yato2Denis Scutariu Yato2 Data 6 martie 2020 13:16:32
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 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, mat[2005][2005], b[17], minim = (1 << 30);
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;
            }
        }
    }
}

void afis(int nr) {
    int a = 1;
    for(int i = 1; i <= nr; ++i){
        // cout << suma << ' ' << a << ' ' << b[i] << ' ' << mat[a][b[i]] << '\n';
        suma += mat[a][b[i]];
        a = b[i];
    }
    // cout << suma << ' ' << a << ' ' << n << ' ' << mat[a][n] << '\n';
    suma += mat[a][n];
    if(minim > suma){
        minim = suma;
    }
    suma = 0;
}

void back(int nr) {
    for(int i = 1; i <= k; ++i) {
        if(!ok[vec[i]]){
            b[nr] = vec[i];
            ok[vec[i]] = 1;
            if(nr == k)
                afis(nr);
            else{
                back(nr + 1);
            }
            ok[vec[i]] = 0;
        }
    }
}

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);
    for(int i = 1; i <= n; ++i)
        mat[1][i] = d[i];
    for(int i = 1; i <= k; ++i) {
        dijkstra(vec[i]);
        for(int t = 1; t <= n; ++t)
            mat[vec[i]][t] = d[t];
    }
    // for(int i = 1; i <= k; ++i, out << '\n')
    //     for(int j = 1; j <= n; ++j)
    //         cout << mat[vec[i]][j] << ' ';
    if(k == 0)
        out << mat[1][n];
    else {
        back(1);
        out << minim;
    }
    return 0;
}