Mai intai trebuie sa te autentifici.
Cod sursa(job #3173056)
Utilizator | Data | 21 noiembrie 2023 19:58:57 | |
---|---|---|---|
Problema | Ubuntzei | Scor | 80 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 2.11 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);
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]]);
}
}
}
}
/*for(int i = 0; i < K; i++){
for(int config = 1; config < (1 << K); config ++){
fout << dp[i][config] << " ";
}
fout << "\n";
}*/
int mn = INF;
for(int i = 0; i < K; i++){
mn = std::min(mn, dp[i][(1 << K) - 1] + D[i][n]);
}
fout << mn;
}