Pagini recente » Borderou de evaluare (job #1278936) | Borderou de evaluare (job #1943125) | Cod sursa (job #2004841) | Parcare2 | Cod sursa (job #3308955)
/*
before u copy my code
go to twitch.tv/bigbigmongey
and ask if he is a femboy
*/
#include <bits/stdc++.h>
// #define int long long
#define fi first
#define se second
using namespace std;
struct minheap {
int v;
int node;
bool operator<(const minheap &a) const {
return v > a.v;
}
};
void dijkstra(int st, vector<int> &ans, vector<vector<pair<int, int>>> &a) {
priority_queue<minheap> pq;
pq.push({0, st});
while(!pq.empty()) {
int v = pq.top().v;
int node = pq.top().node;
pq.pop();
if(ans[node] != 1e9)
continue;
ans[node] = v;
for(auto i : a[node]) {
pq.push({v + i.se, i.fi});
}
}
}
signed main() {
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, m; cin >> n >> m;
vector<int> frien;
int k; cin >> k;
for(int i = 0; i < k; i ++) {
int x; cin >> x;
frien.push_back(x);
}
vector<vector<pair<int, int>>> a(n + 1);
for(int i = 0; i < m; i ++) {
int x, y, z; cin >> x >> y >> z;
a[x].push_back({y, z});
a[y].push_back({x, z});
}
vector<int> bfs1(n + 1, 1e9);
dijkstra(1, bfs1, a);
// value start mask last
vector<vector<int>> dp((1 << k), vector<int>(n + 1, 1e9));
vector<vector<int>> scared(k, vector<int>(k + 1, 1e9));
frien.push_back(n);
for(int i = 0; i < k; i ++) {
vector<int> tempbfs(n + 1, 1e9);
dijkstra(frien[i], tempbfs, a);
for(int j = 0; j <= k; j ++) {
if(i == j)
continue;
scared[i][j] = tempbfs[frien[j]];
}
dp[(1 << i)][i] = bfs1[frien[i]];
}
for(int mask = 1; mask < (1 << k); mask ++) {
for(int i = 0; i < k; i ++) {
if((mask & (1 << i)) == 0)
continue;
for(int j = 0; j < k; j ++) {
if((mask & (1 << j)) != 0)
continue;
if(dp[mask ^ (1 << j)][j] > dp[mask][i] + scared[i][j]) {
dp[mask ^ (1 << j)][j] = dp[mask][i] + scared[i][j];
}
}
}
}
int ans = 1e9;
for(int i = 0; i < k; i ++) {
ans = min(dp[(1 << k) - 1][i] + scared[i][k], ans);
}
cout << ans;
}