#include <bits/stdc++.h>
#define task ""
#define int long long
#define ll long long
#define endl "\n"
#define double long double
#define ii pair<int, int>
#define li pair<ll, int>
#define fi first
#define se second
#define f0(i, n) for (int i = 0; i < n; ++i)
#define f1(i, n) for (int i = 1; i <= n; ++i)
#define c_bit(i) __builtin_popcountll(i)
#define Bit(mask, i) ((mask >> i) & 1)
#define onbit(mask, i) ((mask) bitor (1LL << i))
#define offbit(mask, i) ((mask) &~ (1LL << i))
#define reversebit(mask, i) ((mask) ^ (1LL << i))
#define log2(n) 63 - __builtin_clzll(n)
using namespace std;
template <typename T> bool maximize(T &a, T b) { return a < b ? a = b, true : false; }
template <typename T> bool minimize(T &a, T b) { return a > b ? a = b, true : false; }
template <typename T> using pqmin = priority_queue<T, vector <T >, greater <T >>;
//_____________________________________________________________________________________
const int maxn = 1e5 * 1ll + 5;
const int mod = 1e9 + 7;
const int oo = 1e18 * 1ll;
ll n, k, m, root;
ll impt[6];
ll f[1 << 5][maxn];
vector <ii> a[maxn];
struct state{
ll dist;
ll u;
bool operator < (const state &other) const {
return dist > other.dist;
}
};
//_____________________________________________________________________________________
signed main()
{
ios_base::sync_with_stdio(false); cin.tie(nullptr);
if(fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin >> n >> k >> m;
cin >> root; k--;
f0 (i, k) cin >> impt[i];
f1 (i, m){
ll u, v, w; cin >> u >> v >> w;
a[u].push_back({v, w});
a[v].push_back({u, w});
}
f1 (mask, (1 << k) - 1) f1 (i, n) f[mask][i] = oo;
priority_queue <state> pq;
pq.push({0, root});
f0 (mask, 1 << k) {
f1(i, n) {
for(int sub = mask; sub >= 0; --sub) {
sub &= mask;
minimize(f[mask][i], f[sub][i] + f[mask ^ sub][i]);
}
if(f[mask][i] != oo) pq.push({f[mask][i], i});
}
while(!pq.empty()) {
ll dist = pq.top().dist;
ll u = pq.top().u;
pq.pop();
if(dist > f[mask][u]) continue;
for(ii x : a[u]) {
ll v = x.first;
ll w = x.second;
if(minimize(f[mask][v], dist + w)) {
pq.push({f[mask][v], v});
}
}
}
f0 (i, k) minimize(f[mask | (1 << i)][impt[i]], f[mask][impt[i]]);
}
cout << f[(1 << k) - 1][root];
return 0;
}
Compilation message (stderr)
cities.cpp: In function 'int main()':
cities.cpp:50:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
50 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
cities.cpp:51:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
51 | freopen(task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |