Cod sursa(job #3173367)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 22 noiembrie 2023 17:59:22
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <cstring>
#include <iostream>
#define INF 2e9
std::ifstream fin("ubuntzei.in");
std::ofstream fout("ubuntzei.out");
int n, m, K;
std::vector<std::vector<std::pair<int, int>>> V;
std::unordered_map<int, int> M1;
int D[17][2001], dp[16][(1 << 15) + 5];
void dist(int start, int i){
    std::queue<std::pair<int, int>> Q;
    Q.push({0, start});
    D[i][start] = 0;
    while(!Q.empty()){
        int node = Q.front().second;
        Q.pop();
        for(std::pair<int, int> it : V[node]){
            if(D[i][it.first] > D[i][node] + it.second){
                D[i][it.first] = D[i][node] + it.second;
                Q.push({D[i][it.first], it.first});
            }
        }
    }
}
int main(){
    fin >> n >> m;
    fin >> K;
    std::fill_n(*D, sizeof(D) / sizeof(**D), INF);
    std::fill_n(*dp, sizeof(dp) / sizeof(**dp), INF);
    V = std::vector<std::vector<std::pair<int, int>>> (n + 1);
    int val;
    for(int i = 0; i < K; i++){
        fin >> val;
        M1[i] = val;
    }
    int x, y, c;
    for(int i = 1; i <= m; i++){
        fin >> x >> y >> c;
        V[x].push_back({y, c});
        V[y].push_back({x, c});
    }
    
    for(int i = 0; i < K; i++)
        dist(M1[i], i);
    dist(1, 16);
    if(K == 0){
        fout << D[16][n]; return 0; 
    }
    for(int config = 1; config < (1 << K); config++) {
        for(int i = 0; i < K; i++){
            if(config == (1 << i))
                dp[i][config] = D[16][M1[i]];
            if(config & (1 << i)){ 
                for(int j = 0; j < K; j++){
                    if(i != j && (config & (1 << j)))
                        dp[i][config] = std::min(dp[i][config], 
                        dp[j][config ^ (1 << i)] + D[i][M1[j]]);
                }
            }
        }
    }
    
    int mn = INF;
    for(int i = 0; i < K; i++){
        mn = std::min(mn, dp[i][(1 << K) - 1] + D[i][n]);
    }
    fout << mn;
}