Pagini recente » Cod sursa (job #150898) | Cod sursa (job #948106) | Cod sursa (job #990173) | Cod sursa (job #1726108) | Cod sursa (job #3213083)
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
// Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula Skibidi Pula
//(cred ca innebunesc ajutor ajuta ti ma va rog nu mai suport)
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int nmax = 2e3, kmax = 15, inf = 1e9 + 7979, maskmax = (1 << (kmax + 2));
priority_queue<pii, vector<pii>, greater<pii>> pq;
vector<pii> g[nmax + 1], gmic[kmax + 2];
vector<int> ubu(kmax + 2), minn(nmax + 1, inf);
vector<bool> ped(nmax + 1, 0);
int dp[maskmax][kmax + 2];
int n, m, k, x, y, ct;
void read() {
fin >> n >> m >> k;
ubu[0] = 1;
for(int i = 1; i <= k; i++) {
fin >> x;
ubu[i] = x;
}
ubu[k + 1] = n;
for(int i = 1; i <= m; i++) {
fin >> x >> y >> ct;
g[x].push_back({y, ct});
g[y].push_back({x, ct});
}
k += 2;
}
void make_djikstra(int start) {
minn = vector<int>(nmax + 1, inf);
ped = vector<bool>(nmax + 1, 0);
pq.push({0, ubu[start]});
minn[ubu[start]] = 0;
while(!pq.empty()) {
int cur_nod = pq.top().second, cur_cost = pq.top().first;
pq.pop();
if(cur_cost > minn[cur_nod])
continue;
for(auto [n_nod, n_cost] : g[cur_nod]) {
if(minn[n_nod] > n_cost + cur_cost) {
pq.push({n_cost + cur_cost, n_nod});
minn[n_nod] = n_cost + cur_cost;
}
}
}
for(int i = 0; i < k; i++) {
if(i == start)
continue;
else
gmic[start].push_back({i, minn[ubu[i]]});
}
}
void make_smol_graph() {
for(int i = 0; i < k; i++)
make_djikstra(i);
}
void hamilton() {
for(int i = 0; i < k; i++)
for(int mask = 0; mask < (1 << (k)); mask++)
dp[mask][i] = inf;
dp[1][0] = 0;
for(int mask = 1; mask < (1 << (k)); mask++) {
for(int ubuntzel = 0; ubuntzel < k; ubuntzel++) {
if(((1 << ubuntzel) & mask)) {
int cost = dp[mask][ubuntzel];
for(auto [nnode, ncost] : gmic[ubuntzel]) {
if(!((1 << nnode) & mask))
dp[(mask | (1 << nnode))][nnode] = min(dp[(mask | (1 << nnode))][nnode], cost + ncost);
}
}
}
}
}
void print() {
int rez = inf, allmask = (1 << (k)) - 1;
for(int i = 0; i < k; i++)
rez = min(rez, dp[allmask][i]);
fout << rez << "\n";
}
int main() {
read();
make_smol_graph();
hamilton();
print();
return 0;
}